gpt4 book ai didi

python - python unittest在setUp方法中报错的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:36:29 26 4
gpt4 key购买 nike

我读过一些关于在 Python 单元测试的 setUp 方法中使用 assert 的相互矛盾的建议。如果测试依赖的先决条件失败,我看不出测试失败有什么害处。

例如:

import unittest

class MyProcessor():
"""
This is the class under test
"""

def __init__(self):
pass

def ProcessData(self, content):
return ['some','processed','data','from','content'] # Imagine this could actually pass

class Test_test2(unittest.TestCase):

def LoadContentFromTestFile(self):
return None # Imagine this is actually doing something that could pass.

def setUp(self):
self.content = self.LoadContentFromTestFile()
self.assertIsNotNone(self.content, "Failed to load test data")
self.processor = MyProcessor()

def test_ProcessData(self):
results = self.processor.ProcessData(self.content)
self.assertGreater(results, 0, "No results returned")

if __name__ == '__main__':
unittest.main()

这对我来说似乎是一件合理的事情,即确保测试能够运行。当由于设置条件而失败时,我们得到:

F
======================================================================
FAIL: test_ProcessData (__main__.Test_test2)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Projects\Experiments\test2.py", line 21, in setUp
self.assertIsNotNone(self.content, "Failed to load test data")
AssertionError: unexpectedly None : Failed to load test data

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

最佳答案

setUp 的目的是减少Boilerplate code它在 Arrange 阶段在测试类中的测试之间创建。

在安排阶段,您: 设置运行测试代码所需的一切。这包括测试运行所需的依赖项、模拟和数据的任何初始化。

根据以上段落,您不应在 setUp 方法中断言任何内容。

如前所述; 如果您不能创建测试先决条件,那么您的测试就失败了。为了避免这种情况,Roy Osherove 写了一本很棒的书:The Art Of Unit Testing (为了完全披露,Lior Friedman(他是 Roy 的老板)是我的 friend ,我与他们密切合作了 2 年多,所以我有点偏见......)

基本上只有几个原因需要在安排阶段与外部资源进行交互(或与可能导致异常的事物进行交互),其中大多数(如果不是全部)都与集成测试相关。

回到你的例子;有一种模式来构建测试,其中您需要加载外部资源(对于所有/大多数资源)。只是旁注;在决定应用此模式之前,请确保您不能将此内容作为 UT 类中的静态资源,如果其他测试类需要使用此资源,请将此资源提取到模块中。

以下模式降低了失败的可能性,因为您对外部资源的调用较少:

class TestClass(unittest.TestCase):

def setUpClass(self):
# since external resources such as other servers can provide a bad content
# you can verify that the content is valid
# then prevent from the tests to run
# however, in most cases you shouldn't.
self.externalResourceContent = loadContentFromExternalResource()


def setUp(self):
self.content = self.copyContentForTest()

优点:

  1. 减少失败的机会
  2. 防止不一致行为(1.某人/某人编辑了外部资源。2.您在某些测试中未能加载外部资源)
  3. 执行速度更快

缺点:

  1. 代码比较复杂

关于python - python unittest在setUp方法中报错的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37134320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com