django-測試factory

參考文檔: 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開始的時候運行一次
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容