參考文檔: http://factoryboy.readthedocs.io/en/latest/
創(chuàng)建
- model放在
meta里面, 然后寫字段 - 三種創(chuàng)建方法,build(創(chuàng)建instance不保存),create 創(chuàng)建instance并且保存(默認),stub 不創(chuàng)建instance返回屬性
- UserFactory() 等同于 UserFactory.craeate()
- 批量創(chuàng)建 UserFactory.build_batch()
import factory
from . import models
class UserFactory(factory.Factory):
class Meta:
model = models.User
first_name = 'John'
last_name = 'Doe'
admin = False
切實的,隨機值 faker
- first_name = factory.faker('first_name')
惰性屬性
大多數(shù)值可以直接固定,但是有一些值是要在創(chuàng)建instance的時候計算出來的,
- factory.lazyAttribute()
- factory.lazyFunction()
factory.lazyAttribute會傳遞一個自身的instance作為參數(shù)進去使用,而factory.lazyFunction則沒有傳遞參數(shù)
class UserFactory(factory.Factory):
class Meta:
model = models.User
first_name = 'Joe'
last_name = 'Blow'
email = factory.LazyAttribute(lambda a: '{0}.{1}@example.com'.format(a.first_name, a.last_name).lower())
date_joined = factory.LazyFunction(datetime.now)
Sequences序列
對于一些unique的字段,可以用序列來避免重復(fù)
class UserFactory(factory.Factory):
class Meta:
model = models.User
email = factory.Sequence(lambda n: 'person{0}@example.com'.format(n))
關(guān)聯(lián)
有一些字段是需要他們自己定義factory的,比如外鍵。這個時候使用subfactory
class PostFactory(factory.Factory):
class Meta:
model = models.Post
author = factory.SubFactory(UserFactory)
ROM支持,不同行框架的使用
- Django, with factory.django.DjangoModelFactory
- Mogo, with factory.mogo.MogoFactory
- MongoEngine, with factory.mongoengine.MongoEngineFactory
- SQLAlchemy, with factory.alchemy.SQLAlchemyModelFactory
debug
with factory.debug():
obj = TestModel2Factory()
import logging
logger = logging.getLogger('factory')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
使用數(shù)據(jù)庫里面的外鍵
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.User
language = factory.Iterator(models.Language.objects.all())
特殊函數(shù)
- setup():每個測試函數(shù)運行前運行
- teardown():每個測試函數(shù)運行完后執(zhí)行
- setUpClass():必須使用@classmethod 裝飾器,所有test運行前運行一次
- tearDownClass():必須使用@classmethod裝飾器,所有test運行完后運行一次
- setUpTestData():這個testcase開始的時候運行一次