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

时间:2016-03-11 10:27:18

标签: python django testing

我已将测试用例写入两个单独的测试文件(例如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并包含我的测试用例的常见部分,例如User.objects.create_userself.client.login等...

不幸的是,我最终得到了数据库的错误,尽管它在下次运行中说Destroying test database for alias 'default'...我得到了用户名重复,例如Duplicate entry 'tempUsername' for key 'username'等......

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

它指出self.client变量未与我正在创建的test_user绑定。

我尝试在线搜索并找到有关如何克服我的问题的文档,但所有文档都指向单独使用单独的脚本进行测试,如果您有不同的测试用例,我可以理解。在我的情况下,90%的测试用例完全相同。

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

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

提前感谢您的时间和精力。

1 个答案:

答案 0 :(得分:2)

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

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

从您的问题来看,我不确定test_data每个班级是否有所不同。如果是这样,您将不得不稍微改变一下。