gpt4 book ai didi

python - 如何避免在 Django 中重复测试用例?

转载 作者:行者123 更新时间:2023-11-28 21:09:55 25 4
gpt4 key购买 nike

我在两个单独的测试文件中编写了我的测试用例(例如 test_1 和 test_2)。在我测试我的模型的两个测试用例中,由于过程相似,我都有代码重复。

例如,我需要登录用户并测试凭据。

代码示例:

import test_data

from django.test import TestCase
from UserData.models import MyModel
from django.contrib.auth.models import User

class UserDataMyModelTestCalls(TestCase):
@classmethod
def setUpTestData(cls):
cls.test_user = User.objects.create_user(test_data.test_user_data['user_name'],
test_data.test_user_data['email'],
test_data.test_user_data['password'])

def test_faulty_login_credentials(self):
self.client.login(username=test_data.faulty_user_data['user_name'], password=test_data.faulty_user_data['password'])
response = self.client.get('/userdata/mymodelurl/', {})
self.assertEqual(response.status_code, 403)

我正在使用带有用户凭据的单独文件以避免再次重复。

test_data 文件示例:

test_user_data = {'id': u'1',
'user_name': 'tempUsername',
'password': 'tempPassword',
'email': 'tempEmaily@test.com'}

更新:添加我想用作所有测试用例的通用类的 UserTests 类。我正在通过 test_1.py 定义和调用测试,如下所示:

import UserTests

from django.test import TestCase


class UserDataWayPointTestCalls(TestCase):

testCasesObject = UserTests.UserDataTestCalls()
test_user = testCasesObject.setUpTestData()
response = testCasesObject.test_faulty_login_credentials()

我的 UserDataTestCalls 类定义如下:

import test_data

from django.test import Client
from django.test import TestCase
from django.contrib.auth.models import User


class UserDataTestCalls(TestCase):
def __init__(self):
self.test_user = None
self.faulty_login_response = None

def setUpTestData(self):
self.client = User.objects.create_user(test_data.test_user_data['user_name'],
test_data.test_user_data['email'],
test_data.test_user_data['password'])
self.client = Client()
return self.client

def test_faulty_login_credentials(self):
self.client.login(username=test_data.faulty_user_data['user_name'],
password=test_data.faulty_user_data['password'])
response = self.client.get('/userdata/mymodelurl/', {})
return response

当我执行上面的代码时,我得到了 IntegrityError: (1062, "Duplicate entry 'tempUsername' for key 'username'")。我暂时修改了 username 值以继续,但我收到以下错误 AttributeError: 'UserDataTestCalls' object has no attribute '_testMethodName'

我试图创建一个单独的类,其名称例如UserDataTestCalls 并包括我的测试用例的公共(public)部分,例如 User.objects.create_userself.client.login 等...

不幸的是,我最终得到了数据库错误,尽管它说 Destroying test database for alias 'default'... 在下一次运行时我得到了用户名重复,例如键“username”的重复条目“tempUsername” 等...

当我试图通过更改用户名来解决这个问题以进行测试时,我遇到了另一个问题'NoneType' object has no attribute 'login'

它指出 self.client 变量未与我创建的 test_user 绑定(bind)。

我试图在线搜索并找到有关如何解决我的问题的文档,但所有文档都指向对您的测试分别使用单独的脚本,如果您有不同的测试用例,我可以理解。就我而言,90% 的测试用例完全相同。

所以我确信有一种方法可以在单独的类中创建用户并在该类中创建我的所有测试用例,这样我就可以在需要时从单独的测试文件中调用它们。

有人可以指出正确的方向或提供一些我可以阅读的示例/文档链接吗?

预先感谢您的时间和精力。

最佳答案

尝试创建一个通用测试类。

class CreateUserTestCase(TestCase):

def setUpTestData(self):
self.user = User.objects.create_user(
test_data.test_user_data['user_name'],
test_data.test_user_data['email'],
test_data.test_user_data['password'],
)

您想将新用户分配给 self.user。不要替换 self.client ,它应该是测试客户端,而不是用户。您不需要执行 self.client = Client(),Django 测试用例会为您处理这件事。

然后子类化测试用例并添加您的测试。

class UserDataTestCalls(CreateUserTestCase):

def test_faulty_login_credentials(self):
self.client.login(
username=test_data.faulty_user_data['user_name'],
password=test_data.faulty_user_data['password'],
)
response = self.client.get('/userdata/mymodelurl/', {})
return response

从你的问题来看,我不确定每个类(class)的 test_data 是否不同。如果是这样,您必须稍微更改一下。

关于python - 如何避免在 Django 中重复测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com