具有所有可能组合的 Django fixture?
Django fixture with all possible combinations?
我正在尝试测试统计功能,该功能计算我的数据库中的对象类型。为此,我想为每种可能的模型字段组合至少创建一个实例。随机测试数据需要大量的测试对象来确保满足所有可能的组合。
这是我的一个模型的简短示例:
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 一起工作。
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)
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 问答以获取 dict 解决方案。
我正在尝试测试统计功能,该功能计算我的数据库中的对象类型。为此,我想为每种可能的模型字段组合至少创建一个实例。随机测试数据需要大量的测试对象来确保满足所有可能的组合。
这是我的一个模型的简短示例:
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 一起工作。
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)
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 问答以获取 dict 解决方案。