1

一段时间以来,我使用 Faker 工具(Python FakerPhp FakerRuby Faker ...)为我的测试或演示数据生成我的固定装置。

我想始终获得相同的生成数据,然后我使用随机种子功能,这是一个非常简单的示例:

import unittest
from faker import Faker
fake = Faker()
fake.seed(4321)

# My model
class Contact(object):
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(fake.first_name(), fake.last_name())
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')

        c2 = Contact(fake.first_name(), fake.last_name())
        self.assertEqual(c2.firstname, u'Anika')
        self.assertEqual(c2.lastname, u'Dare')

unittest.main()

好的,一切都很棒。

接下来,我处理我的项目,我需要将一个新字段附加到 Contact :

class Contact(object):
    def __init__(self, firstname, lastname, city):
        self.firstname = firstname
        self.lastname = lastname
        self.city = city

我更新了我的测试:

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(fake.first_name(), fake.last_name(), fake.city())
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')
        self.assertEqual(c1.city, u'East Freddieside')

        c2 = Contact(fake.first_name(), fake.last_name(), fake.city())
        self.assertEqual(c2.firstname, u'Allison')
        self.assertEqual(c2.lastname, u'Dibbert')
        self.assertEqual(c2.city, u'West Leathabury')

如果你在第一次和第二次测试中查看“c2.firstname”和“c2.lastname”断言,你会看到我的痛苦:当我在我的夹具生成中间插入新的假数据时,我需要更新以下所有断言.

小测没问题,但是多测就很痛苦了。

你对这个问题有什么建议吗?

我考虑过使用许多随机生成器实例,你认为这是一个好的方向吗?

4

2 回答 2

1

您只需要先设置数据,然后根据这些数据创建断言。我还建议使用 namedtuple 和可重用的工厂。

ContactData = namedtuple('Contact', ['first_name', 'last_name', 'city'])
def contactFactory():
   return ContactData(fake.first_name(), fake.last_name(), fake.city())
d1 = contactFactory()
c1 = Contact(*d1) # or Contact(**vars(d1))
assert c1.first_name == d1.first_name
于 2014-01-23T08:53:56.413 回答
-1

这不是一个好的单元测试用例,因为它依赖于 Faker 库的行为。如果 Faker 的创建者更改他们的姓名列表,则测试用例的结果可能会发生变化。同时,您的代码可能根本没有改变。

一个好的测试用例应该是独立的,并测试一段非常具体的代码。例如

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(u'Deonte', u'Jaskolski', u'East Freddieside')
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')
        self.assertEqual(c1.city, u'East Freddieside')

同样,从 Django 的角度来看,这个测试用例不是必需的。Django 代码经过了很好的测试。编写测试用例来检查模型实例是否已正确初始化将是多余的。

于 2014-01-23T08:45:53.790 回答