<p>假设您不想在正常操作期间检查值<em>all</em>,首先想到的是内置的<a href="http://docs.python.org/2/library/unittest.html" rel="nofollow noreferrer">unit test module</a>。在</p>
<p>如果您需要做一些更复杂的事情,而这些事情不能像下面所示的那样干净地隔离测试,请查看我不得不解决的一些<a href="https://stackoverflow.com/q/5834872/157744">my issues</a>。值得注意的是,我最终推出了自己的测试运行程序,它的行为与单元测试非常相似,但控制能力更强。下个月左右我会把它推到py pi。在</p>
<p><strong>工作单元测试示例</strong></p>
<pre><code>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()
</code></pre>
<p><strong>根据接受的答案更新</strong></p>
<p>如果这只是一个测试脚本,并且你的模拟累加器没有在测试之外使用,那么考虑下面的mod。<em>我仍然相信,从长远来看,编写单元测试将更好地为您服务</p>
^{pr2}$
<p>这将允许您迭代任何想要的列表,而不必考虑调用check函数。提供了两种方法供您检查。在</p>
<ol>
<li><p>如果不匹配,<code>assert</code>调用将抛出异常(仅在假设这将作为测试脚本存在的情况下建议)。</p></li>
<li><p>删除<code>assert</code>并检查调用脚本的返回状态(而不是显式调用<code>check()</code>)也可以清理问题。</p></li>
</ol>