从那时起,我使用Faker工具(Python Faker,Php Faker,Ruby 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”断言,你可以看到我的痛苦:当我在我的灯具生成过程中插入新的假数据时,我需要更新全部以下断言。
小测试不是问题,但多次测试非常痛苦。
您有关于此问题的一些提示吗?
我考虑使用许多随机生成器实例,你认为这是一个好方向吗?
答案 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代码经过了很好的测试。编写测试用例以检查模型实例是否已正确初始化将是多余的。