Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不使用python';现在,测试中的断言语句是什么?_Python_Unit Testing_Pytest_Assert_Nose - Fatal编程技术网

为什么不使用python';现在,测试中的断言语句是什么?

为什么不使用python';现在,测试中的断言语句是什么?,python,unit-testing,pytest,assert,nose,Python,Unit Testing,Pytest,Assert,Nose,在Python测试中,为什么要使用断言方法: self.assertEqual(response.status_code, 200) self.assertIn('key', my_dict) self.assertIsNotNone(thing) 与直接断言相反: assert response.status_code == 200 assert 'key' in my_dict assert thing is not None 根据报告: 使用这些方法代替assert语句,以便测试运行者

在Python测试中,为什么要使用断言方法:

self.assertEqual(response.status_code, 200)
self.assertIn('key', my_dict)
self.assertIsNotNone(thing)
与直接断言相反:

assert response.status_code == 200
assert 'key' in my_dict
assert thing is not None
根据报告:

使用这些方法代替assert语句,以便测试运行者可以累积所有测试结果并生成报告

然而,这似乎是假的,测试运行者可以累积结果并生成报告。在一个unutbu中,unittest将产生一个
AssertionError
,与assert语句一样,这是7年前的事了,所以它也不是一个闪亮的新特性


对于pytest这样的现代测试运行程序,断言助手方法生成的失败消息不再具有可读性(可以说unittest的camelCase样式可读性较差)那么,为什么不在测试中使用assert语句呢?您认为存在哪些缺点,以及为什么像CPython这样的重要项目还没有离开unittest?

您找到的文档链接就是正确答案。如果您不喜欢这种编写测试的风格,我强烈建议您使用pytest:


pytest已经做了大量工作,允许您以您想要的方式使用assert语句。它还有一系列其他非常好的功能,比如它们的装置。

使用
assert
关键字或专用方法的关键区别在于输出报告。请注意,
assert
后面的语句始终是
True
False
,不能包含任何额外信息

assert 3 == 4
只需在报告中显示一个
AssertionError
。 但是,

提供一些额外信息:
AssertionError:False不是真的
。不是很有帮助,但请考虑:

self.assertEqual(3, 4)
它告诉您,
AssertionError:3!=4
。你读了报告,你知道它是什么样的断言(平等测试)和涉及的值

假设您有一些函数,并希望断言它返回的值。 您可以通过两种方式完成:

# assert statement
assert your_function_to_test() == expected_result

# unittest style
self.assertEqual(your_function_to_test(), expected_result)
在出现错误的情况下,第一个命令除了断言错误之外,没有提供任何信息,第二个命令告诉您断言的类型(相等性测试)和涉及的值(返回值和期望值)


对于小型项目,我从不使用unittest样式,因为它的键入时间较长,但在大型项目中,您可能希望了解更多有关错误的信息。

我认为对于当前的pytest版本,您可以在大多数情况下使用
assert
,因为上下文是由测试框架重建的(pytest 2.9.2):

def测试请求(自):
...
>self.assertEqual(cm.exception.response.status_代码,200)
E断言错误:404!=200
看起来像

def测试请求(自):
...
>断言cm.exception.response.status_code==200
断言错误:断言404==200
E-404
E+200

理论上,使用
self.assertXxx()
方法将允许pytest统计未失败的断言的数量,但似乎没有这样的度量。

到目前为止,我使用的是
unittest
而不是
assert
。我认为这一切都取决于你的项目的复杂性和规模。这似乎主要是一个意见问题。如果你认为
assert
更优越,那么没有什么可以阻止你使用它(除了你的同事可能不同意)。但是,应该知道,您可能会重写
TestCase
类中的方法并自定义行为,
assert
语句没有这种灵活性。也可以修改<代码>测试用例。故障排除< /代码>,这可能会使您的观点无效,因为它是从<代码> Asjts>代码>语句中抛出的同样的异常(如果您想考虑<代码>断言< /代码>一个错误而不是失败),就可以使用。所以,如果测试失败,请始终使用
pytest
。@o11c是的,我同意。但问题更多的是,为什么所有这些
self.assertStuff
方法都存在,为什么许多备受尊敬的库仍然积极使用它们。正如问题中提到的,我确实使用pytest。当测试运行者愉快地累积所有测试结果并生成报告时,无论您使用的是断言语句还是帮助函数,文档中的声明如何被认为是正确的?您可以向断言中添加任意字符串,以包含在引发的
AssertionError
assert3==4,“3!=4”
。更重要的是,测试运行程序/测试框架能够自动生成上下文。
# assert statement
assert your_function_to_test() == expected_result

# unittest style
self.assertEqual(your_function_to_test(), expected_result)