我喜欢sorens对问题和示例代码的直截了当的 [Answer][1],特别是因为我不熟悉补丁/模拟等新功能。sorens没有建议一种方法来使示例代码的TestStdIO类的自定义断言方法可重用,而无需借助剪切/粘贴,因此我采用了使TestStdIO成为在其自己的模块中定义的“mixin”类的方法(teststdoutmethods.py在下面的例子)。由于 TestStdIO 中使用的通常unittest.TestCase提供的断言方法引用也将在测试用例类中可用,因此我从他的示例代码中删除了import unittest行以及TestStdIO的派生来自类声明中的unittest.TestCase,即
import io
import sys
class TestStdIO(object):
def setUp(self):
...
否则,TestStdIO 的代码与 sorens 的版本一样,没有最后的两个示例用法。我在 Ch 中的一个基本示例文本游戏中的一个类的一些简单的单元测试测试用例中使用了TestStdIO的这个 mixin 类版本。Kinsley 和 McGugan使用 PyGame 开始 Python 游戏编程的2 篇,例如
import unittest
from teststdoutmethods import TestStdIO # sorens' TestStdIO as a mixin.
from tank import Tank # From Beginning Python Game Programming with PyGame.
class Test_Tank_fire(TestStdIO, unittest.TestCase): # Note multiple inheritance.
def test_Tank_fire_wAmmo(self):
oTank1 = Tank('Bill', 5, 100)
oTank2 = Tank('Jim', 5, 100)
self.setUp()
oTank1.fire_at(oTank2)
self.assertStdoutEquals("Bill fires on Jim\nJim is hit!")
self.assertEqual(str(oTank1), 'Bill (100 Armor, 4 Ammo)', 'fire_at shooter attribute results incorrect')
self.assertTrue(str(oTank2) == 'Jim (80 Armor, 5 Ammo)', 'fire_at target attribute results incorrect')
self.tearDown()
def test_Tank_fire_woAmmo(self):
oTank1 = Tank('Bill', 5, 100)
oTank2 = Tank('Jim', 5, 100)
# Use up 5 allotted shots.
for n in range(5):
oTank1.fire_at(oTank2)
self.setUp()
# Try one more.
oTank1.fire_at(oTank2)
self.assertStdoutEquals("Bill has no shells!")
self.tearDown()
def test_Tank_explode(self):
oTank1 = Tank('Bill', 5, 100)
oTank2 = Tank('Jim', 5, 100)
# Use up 4 shots.
for n in range(4):
oTank1.fire_at(oTank2)
self.setUp()
# Fifth shot should finish the target.
oTank1.fire_at(oTank2)
self.assertStdoutEquals("Bill fires on Jim\nJim is hit!\nJim explodes!")
self.tearDown()
self.assertTrue(str(oTank2) == 'Jim (DEAD)', 'fire_at target __str__ incorrect when Dead')
测试用例(成功和失败)在 Python 3.7 中运行。请注意,sorens 的技术捕获了 setup() 和 teardown() 调用之间的所有 stdout 输出,因此我将它们放置在将生成我想要检查的特定输出的特定操作周围。我认为我的 mixin 方法是sorens打算用于一般重用的方法,但我想知道是否有人有不同的建议。谢谢。[1]:https ://stackoverflow.com/a/62429695/7386731