当我在我的灯具中插入新的faker数据时,我需要更新许多断言,你有一些提示来解决这个问题吗?

时间:2014-01-23 08:30:31

标签: python fixtures faker

从那时起,我使用Faker工具(Python FakerPhp FakerRuby Faker ...)为我的测试或我的演示数据生成我的灯具。

我希望始终使用random seed feature生成相同的生成数据,这是一个非常简单的示例:

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”断言,你可以看到我的痛苦:当我在我的灯具生成过程中插入新的假数据时,我需要更新全部以下断言。

小测试不是问题,但多次测试非常痛苦。

您有关于此问题的一些提示吗?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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代码经过了很好的测试。编写测试用例以检查模型实例是否已正确初始化将是多余的。