谢谢你的出色答案。没有一个答案是真正完整的,所以我在这里写作a combination of all answers that helped me。如果你喜欢这个答案,请向负责此事的人投票。
结论
单元测试(或在unittest
模块至少单元测试)是二进制。由于Guilherme Chapiewski says:他们将工作,否则他们将失败,没有中期。
因此,我的结论是,单元测试是不完全对这个工作的工具。看起来单元测试更关心“保持一切正常,预计没有失败”,因此我不能(或不容易)进行非二进制测试。
所以,单元测试似乎没有合适的工具,如果我试图改善算法或实现,因为单元测试不能告诉我比其他(假设两者的更好的时候是怎么一个版本它们被正确的实现,那么两者都会通过所有的单元测试)。
我的最终溶液
我的最终解决方案是基于ryber's idea和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 suggested有用。也许我不会使用它这个简单的个人项目,但它可能对未来的项目有用。
你和Guilherme Chapiewski都建议单元测试不适合这份工作。 日志记录似乎是一种矫枉过正,但也许警告可能“足够好”和“足够简单”。稍后再试验它们。 – 2009-09-10 17:52:48
我不知道。没有一个警告看起来像是合适的。我的意思是,UserWarning,但这符合一切。这是另一个进口,另一个依赖,另一个要打破。此外,警告是在事情“几乎破裂”的时候。我想你可以测试B,如果它失败了,抛出“几乎”的错误,但我觉得这可能不是警告模块的目的。 – Jonathanb 2009-09-10 21:20:48