假设您不想在正常操作期间一直检查该值,那么首先想到的就是内置的单元测试模块。
如果您需要做更复杂的事情,而您无法像下面所示那样干净地隔离测试,请查看我必须解决的一些问题。值得注意的是,我最终推出了自己的测试运行器,其行为与单元测试非常相似,但具有更大的控制力。我将在下个月左右将其推向 py-pi。
工作单元测试示例
import unittest
class RealAccumlator(object):
def __init__(self):
self.acc = 0
def add(self, val):
self.acc += val
def set(self, val):
self.acc = val
def get(self):
return self.acc
# Using a global variable as I dont know how "sendCommandToMyProgram"
# is used
real_acc = RealAccumlator()
# Test Script
class MyAccumlator(object):
def __init__(self):
self.acc = 0
def add(self, val):
self.acc += val
real_acc.add(val)
def set(self, val):
self.acc = val
real_acc.set(val)
def check(self):
return self.acc == real_acc.get()
class MockedAccumlatorTests(unittest.TestCase):
def setUp(self):
self.acc = MyAccumlator()
def test_SetFunction(self):
test_values = range(-10,10)
# Test the set commands
for val in test_values:
self.acc.set(val)
self.assertTrue(self.acc.check())
def test_AddFunction(self):
test_values = range(-10,10)
# Set the acc to a known value and to a quick test
self.acc.set(0)
self.assertTrue(self.acc.check())
# Test the add commands
for val in test_values:
self.acc.add(val)
self.assertTrue(self.acc.check())
class RealAccumlatorTests(unittest.TestCase):
def test_SetFunction(self):
test_values = range(-10,10)
# Test the set commands
for val in test_values:
real_acc.set(val)
self.assertEqual(val, real_acc.get())
def test_AddFunction(self):
test_values = range(-10,10)
# Set the acc to a known value and to a quick test
real_acc.set(0)
self.assertEqual(0, real_acc.get())
# Test the add commands
expected_value = 0
for val in test_values:
expected_value += val
real_acc.add(val)
self.assertEqual(expected_value, real_acc.get())
if __name__ == '__main__':
unittest.main()
根据接受的答案更新
如果这只是一个测试脚本并且你的模拟累加器没有在外面使用,那么这个测试考虑以下模块。 从长远来看,我仍然相信编写单元测试会更好地为您服务
class MyAccumlator(object):
def __init__(self):
self.acc = 0
def add(self, val):
self.acc += val
real_acc.add(val)
assert(self.check())
return self.check()
def set(self, val):
self.acc = val
real_acc.set(val)
assert(self.check())
return self.check()
def check(self):
return self.acc == real_acc.get()
这将允许您遍历您想要的任何列表,而无需考虑调用检查函数。提供了两种方法,您可以检查。
assert
如果它们不匹配,则 离开调用将引发异常(仅在假设这将作为测试脚本存在的情况下建议)。
从调用脚本中删除assert
并检查返回状态(而不是显式调用也check()
可能会清理内容。