具有所有可能组合的Django夹具?

时间:2017-11-16 19:28:53

标签: python django unit-testing fixtures

我正在尝试测试统计函数,该函数计算我的数据库中的对象类型。为此,我想创建每个可能的模型字段组合的至少一个实例。随机测试数据需要大量测试对象以确保满足所有可能的组合。

以下是我的一个模特的缩写示例:

class Member(models.Model)
    is_active = models.BooleanField()
    name = models.CharField()
    balance = models.IntegerField()
    division = models.ForeignKey(Division, on_delete=models.CASCADE)

Class Division(models.Model)
    name = models.CharField()

这就是我现在正在使用django_dynamic_fixture:

的方式
from django.test import TestCase
from django_dynamic_fixture import G
from members.models import Member

class StatisticsTestCase(TestCase):
    def setUp(self):
        for is_active in [True, False]:
            for balance in [-100, 0, 100]:
                for division in Division.objects.all()
                    G(Member, is_active=is_active, balance=balance, division=division)

但这看起来很糟糕,很难读懂。是否有更简单的方法可以更好地读取代码以创建对象属性的所有可能组合?

只要它们与Python 3和Django很好地配合使用,我就可以使用不同的测试数据生成器了。

2 个答案:

答案 0 :(得分:1)

import itertools

combinations = list(itertools.product(*[[True, False], [-100, 0, 100]]))
for division in Division.objects.all():
    for is_active, balance in combinations:
        G(Member, is_active=is_active, balance=balance, division=division)

更新:

import itertools

combinations = list(itertools.product([True, False], [-100, 0, 100], Division.objects.all()))
for is_active, balance, division in combinations:
    G(Member, is_active=is_active, balance=balance, division=division)

答案 1 :(得分:0)

Sara的答案向前迈出了一大步,但我仍然不满意代码的可读性,所以我回答了我自己的问题。

variants = {
    'is_active': [True, False],
    'balance': [-100, 0, 100],
    'division': list(Division.objects.all())
}

names = sorted(variants)
products = [dict(zip(names, prod)) for prod in it.product(*(variants[name] for name in names))]

for combination in products:
    G(Member, **combination)

现在,任何想要更改此测试的人都可以轻松查看使用哪些值测试哪个属性。谢谢转到this q& a获取dict解决方案。