素晴らしい答えをありがとう。本当に完全な回答は 1 つだけではなかったので、役に立ったすべての回答を組み合わせてここに書いています。この回答が気に入ったら、これを担当した人に投票してください。
結論
単体テスト (または少なくともunittest
モジュール内の単体テスト) はバイナリです。Guilherme Chapiewski が言うように、それらは機能するか失敗するかであり、中期はありません。
したがって、私の結論は、単体テストはこの仕事に適したツールではないということです。単体テストは「すべてが機能し続けること、失敗は予想されないこと」にもっと関心があるようです。したがって、非バイナリテストを行うことはできません(または簡単ではありません)。
したがって、アルゴリズムまたは実装を改善しようとしている場合、単体テストは適切なツールではないようです。単体テストでは、あるバージョンが他のバージョンと比較してどの程度優れているかがわからないためです (両方が正しく実装されていると仮定します)。 、両方ともすべての単体テストに合格します)。
私の最終的な解決策
私の最終的な解決策は、 wcoenen answerに示されているryber のアイデアとコードに基づいています。私は基本的にデフォルトを拡張し、冗長性を減らしています。次に、私のメイン コードは 2 つのテスト スイートを呼び出します。重要なものは standard を使用し、重要でないものは私自身のあまり冗長でないバージョンを使用します。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 が提案したように、非バイナリ テストを含むテスト フレームワークがあるかどうかを知ることは、依然として有用です。おそらく、この単純な個人的なプロジェクトでは使用しませんが、将来のプロジェクトで役立つ可能性があります。