谢谢你的好答案。没有一个答案是真正完整的,所以我在这里写了所有对我有帮助的答案的组合。如果您喜欢这个答案,请投票支持对此负责的人。
结论
单元测试(或至少unittest
模块中的单元测试)是二进制的。正如Guilherme Chapiewski 所说:他们要么工作要么失败,没有中期。
因此,我的结论是单元测试并不完全适合这项工作。似乎单元测试更关心“保持一切正常,预计不会失败”,因此我不能(或者不容易)进行非二进制测试。
因此,如果我试图改进算法或实现,单元测试似乎不是正确的工具,因为单元测试无法告诉我一个版本与另一个版本相比有多好(假设它们都正确实现,那么两者都将通过所有单元测试)。
我的最终解决方案
我的最终解决方案基于ryber 的想法和wcoenen answer中显示的代码。我基本上是在扩展默认设置TextTestRunner
并使其不那么冗长。然后,我的主要代码调用了两个测试套件:使用标准TextTestRunner
的关键套件,以及使用我自己的不太详细版本的非关键套件。
class _TerseTextTestResult(unittest._TextTestResult):
def printErrorList(self, flavour, errors):
for test, err in errors:
#self.stream.writeln(self.separator1)
self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
#self.stream.writeln(self.separator2)
#self.stream.writeln("%s" % err)
class TerseTextTestRunner(unittest.TextTestRunner):
def _makeResult(self):
return _TerseTextTestResult(self.stream, self.descriptions, self.verbosity)
if __name__ == '__main__':
sys.stderr.write("Running non-critical tests:\n")
non_critical_suite = unittest.TestLoader().loadTestsFromTestCase(TestSomethingNonCritical)
TerseTextTestRunner(verbosity=1).run(non_critical_suite)
sys.stderr.write("\n")
sys.stderr.write("Running CRITICAL tests:\n")
suite = unittest.TestLoader().loadTestsFromTestCase(TestEverythingImportant)
unittest.TextTestRunner(verbosity=1).run(suite)
可能的改进
了解是否有任何具有非二进制测试的测试框架应该仍然有用,就像Kathy Van Stone 建议的那样。可能我不会在这个简单的个人项目中使用它,但它可能对未来的项目有用。