Django 测试 - 打印一系列 n 次相同测试的所有测试失败

Posted

技术标签:

【中文标题】Django 测试 - 打印一系列 n 次相同测试的所有测试失败【英文标题】:Django tests - print all test failures for a series of n times the same test 【发布时间】:2014-10-22 10:41:36 【问题描述】:

我希望 TestCase 中的每个断言测试都经过实际测试,即使第一个测试失败。在我的情况下,所有断言都具有相同的性质。

实际上,我有一些东西可以评估编写为 Python 对象的公式(将其视为以字符串形式编写的公式为 eval'd)。我想做类似的事情:

class MyTest(TestCase):
   def test_something(self):
       for id in ids:
           for expression in get_formulas(id):
                for variable in extract_variables(expression):
                    self.assertIn(variable, list_of_all_variables)

=> 我想查看打印的所有不在list_of_all_variables 中的variables!

这是我复习我所有所谓的公式并能够纠正错误的必要条件。

更多上下文:

我要在一个应用程序中执行可变数量的测试(取决于写入版本化数据文件中的 ID 列表)。

为了拥有可变数量的 TestCase 实例,我确实编写了一个基类(mixin),然后使用 3-args type 函数(即创建类)构建动态类。

这样,我就有n测试,对应n不同的id。这是第一步,但我想要的是对这些测试中的每个断言进行测试,并打印相应的断言错误。

【问题讨论】:

@Louis 非常正确,但是该问题中的 OP 希望保留一个“有凝聚力”的断言列表,而我并不在乎。在继续我的类工厂工作时,我将发布一个适合我需求的解决方案 【参考方案1】:

正如问题Continuing in Python's unittest when an assertion fails 中提到的,断言错误失败是TestCase 类的硬编码行为。

因此,我没有改变它的行为,而是为我的类生成了许多不同的test_... 方法,风格如下:

from django.test import TestCase
from sys import modules


# The list of all objects against which the tests have to be performed
formids = [12,124,234]
# get_formulas returns a list of formulas I have to test independently, linked to a formid
formulas = id: get_formulas(id) for id in formids

current_module = sys.modules(__name__)

def test_formula_method(self, formula):
    # Does some assertions
    self.assertNotEqual(formula.id, 0)

for formid in formids:
    attrs = 'formid': formid
    for f in formulas[formid]:
        # f=f so the 2nd arg to test_formula_method is staying local
        # and not overwritten by last one in loop
        attrs['test_formula_%s' % f.name] = lambda self, f=f: test_formula_method(self, f)

    klass_name = "TestForm%s" % formid
    klass = type(klass_name, (TestCase,), attrs)

    setattr(current_module, klass_name, klass)

【讨论】:

以上是关于Django 测试 - 打印一系列 n 次相同测试的所有测试失败的主要内容,如果未能解决你的问题,请参考以下文章

Django+Vue+Docker搭建接口测试平台实战

软件测试第三次作业

Django中的Python路径不一致-双模块导入

Django单元测试中的Unicode

Django 测试:如何在 SQLite 上测试并发用户?

用一个测试用例测试所有 django 模型