单元测试失败时是否有抛出类似错误信息的约定?

1 投票
2 回答
40 浏览
提问于 2025-04-13 13:28

我正在写单元测试,结果出现了很多类似的错误信息,导致代码看起来很乱。

像这样:

# Test that compare_pass1 is downstream to secondary_pass1
self.assertTrue(
    all(
        task in all_downstream_task_for_secondary_pass1_task
        for task in {compare_pass1}
    ),
    f'One of {compare_pass1} not found in downstream to {secondary_pass1_task task}',
)

# Check that primary_pass1 is upstream to secondary_pass1
self.assertTrue(
    all(
        task in all_upstream_task_for_secondary_pass1_task
        for task in {primary_pass1_task}
    ),
    f'One of {primary_pass1_task} not found in upstream to {secondary_pass1_task} task',
)
    
# Check that secondary_pass1 is upstream to compare_pass1
self.assertTrue(
    all(
        task in all_upstream_task_for_compare_pass1_task
        for task in {secondary_pass1_task}
    ),
    f'one of {secondary_pass1_task} not found in upstream to {compare_pass1_task} task',
)

我说的就是当单元测试失败时抛出的错误信息,虽然它们不完全一样,但信息内容是相似的。

有没有什么约定,建议创建一个函数,然后在抛出错误信息时调用这个函数呢?

2 个回答

0

你还可以自己定义一些断言,用来封装断言的逻辑和错误信息。

你可以把它们作为方法定义在你的测试类里:

class YourTestClass(unittest.TestCase):
    def assertIsDownStream(self, all_downstream_tasks, task, original_task):
        self.assertTrue(
            all(task in all_downstream_tasks for task in {task}),
            f"One of {task} not found in downstream to {original_task} task",
        )

    def assertIsUpStream(self, all_upstream_tasks, task, original_task):
        self.assertTrue(
            all(task in all_upstream_tasks for task in {task}),
            f"One of {task} not found in upstream to {original_task} task",
        )

    # Your test cases here ...

或者你也可以在一个单独的类里定义它们,然后把这个类作为混入使用:

class CustomAssertions:
    def assertIsDownStream(self, all_downstream_tasks, task, original_task):
        self.assertTrue(
            all(task in all_downstream_tasks for task in {task}),
            f"One of {task} not found in downstream to {original_task} task",
        )

    def assertIsUpStream(self, all_upstream_tasks, task, original_task):
        self.assertTrue(
            all(task in all_upstream_tasks for task in {task}),
            f"One of {task} not found in upstream to {original_task} task",
        )


class YourTestClass(unittest.TestCase, CustomAssertions):
    # Your test cases here ...

注意,根据你的具体情况,你可以为参数定义更合适的名称。

在你的测试中,你可以像这样简单地使用这些断言:

# Test that compare_pass1 is downstream to secondary_pass1
self.assertIsDownStream(all_downstream_task_for_secondary_pass1_task, compare_pass1, secondary_pass1_task)
2

你可以使用非f字符串格式化来定义一个字符串模板,然后用变量来填充这个模板:

compare_pass1 = "foo"
secondary_pass1_task = "bar"

s = 'One of {} not found in downstream to {}'

print(s.format(compare_pass1, secondary_pass1_task))

compare_pass2 = "fee"
secondary_pass2_task = "bas"

print(s.format(compare_pass2, secondary_pass2_task))

撰写回答