gpt4 book ai didi

python - 在Python中重写unittest.TestCase的init是不是非常规

转载 作者:太空狗 更新时间:2023-10-30 02:30:55 25 4
gpt4 key购买 nike

只要在调用所有测试(独立)之前需要进行一次初始化,而不是在每次测试之前,我都会在测试类之外的单独函数中进行初始化。我想知道是否可以覆盖 unittest.TestCase__init__ 方法并在那里进行初始化。

这是我通常做的:

import unittest


basket = {}


def initiate():
"""Update Fruit basket - fruits and their ages."""
fruits = {2: "Apples",
4: "Grapes",
3: "Bananas"}
basket.update(fruits)


class FruitBasket(unittest.TestCase):

def test_grapes(self):
"""Any grapes in the basket."""
self.assertIn("Grapes", basket.values())


def test_rotten(self):
"""Stinky test."""
for age in basket.keys():
self.assertLess(age, 4)


if __name__ == "__main__":
initiate()
unittest.main()

initiate() 独立于FruitBasket 测试类。当模块被导入到其他模块时(重复手动初始化),这会成为一个问题。在同一个类(class)中有没有更好的方法来实现这一目标?我之前从未见过 TestCase__init__() 被重写。如果这样做不行(坚持 Pythonic 风格),必须做什么? setUp() 实例方法在这里不合适,因为它在每次测试之前调用,而不是只调用一次。

最佳答案

请注意,在构建套件和运行测试时使用 TestCase.__init__ 来选择要运行的测试方法。事实上,当你想手动创建一个 TestSuite 来运行测试而不使用更高级别的测试运行器接口(interface)时,你可以这样做:

import unittest


class MyTestCase(unittest.TestCase):
def test_one(self):
print("One")
def test_two(self):
print("Two")


suite = unittest.TestSuite([MyTestCase('test_one'), MyTestCase('test_two')])

suite.run(unittest.TestResult())

!您正在为每个 测试创建一个MyTestCase 实例!

请记住,当您使用更高级别的接口(interface)运行测试时,它只是隐藏了如上所述构建 TestSuite 的步骤。

这已经表明您不应该覆盖 __init__,因为它会为每个测试调用一次。

但是 unittest 模块提供了向类甚至模块添加固定装置的机制。查看Class and Module Fixtures unittest 文档的一部分。

特别是 setUpClass and tearDownClass完全按照您的意愿行事:在运行 TestCase 子类的测试之前和之后调用它们 一次


请注意,setUpClass 可能被多次 调用。然而,这只会在手动构建 TestSuite 时发生。例如代码:

import unittest


class MyTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('MyTestCase.setUpClass')
def test_one(self):
print("One")
def test_two(self):
print("Two")

class MyTestCase2(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('MyTestCase2.setUpClass')
def test_three(self):
print('Three')



suite = unittest.TestSuite([MyTestCase('test_one'), MyTestCase2('test_three'), MyTestCase('test_two')])

suite.run(unittest.TestResult())

产生输出:

MyTestCase.setUpClass
One
MyTestCase2.setUpClass
Three
MyTestCase.setUpClass
Two

TestSuite 按顺序执行测试。每当它发现进行测试的类发生变化时,它就会从“当前”类调用 tearDownClass,然后为下一个类调用“setUpClass”。如果您混合使用不同类的测试,您可能会看到多次调用 setUpClasstearDownClass

关于python - 在Python中重写unittest.TestCase的init是不是非常规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340929/

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