1

私はしばらくの間、py.testを使用してpythonの単体テストを書いてきました(ちなみにこれをお勧めします)。

現在、JUnit4 を使用して Java で実行しています。単体テストの興味深い点は、すべてが期待どおりに進まない場合 (Web サービスから予期しないデータが返された、無効な入力データなど)、コードがどのように動作するかを確認することです。Python では、以前は関数ごとに 2 つのテストを行っていました。

  1. 最初のテストでは、すべてが期待どおりに機能する場合のコードの動作を確認します
  2. 2 番目のテストでは、あらゆる種類の潜在的な問題、ネットワークの問題、ダーティ/予期しない/無効な応答データなどをシミュレートします。

私は通常、それらを test_foo() および test_foo_ko() と呼びます。もちろん、Java は camelCase を使用します。

問題は、コードのすべてのケースを 1 つのテストに集中させるべきか、Python で行ってきたようにそれらを 2 つに分割するべきか、それとも単一の可能なケースごとにテストを行うべきかということです。

4

2 に答える 2

2

「methodName_stateUnderTest_ExpectedBehavior」という命名パターンを採用しました。読みやすくするために、テスト名にアンダースコアを使用します (IMO)。

@Test(expected=IllegalArgumentException.class)
public void sum_negativeNumberAs1stParam_ExceptionThrown(){
     //...
}

この命名ポリシーは、エッジ ケースごとに 1 つのテストを作成することも意味します。

また、メソッド名の前に「test」を付けません。これは、JUnit が過去にアノテーションをサポートしていなかったときの要件でしたが、現在は関係ありません (JUnit 4 を使用していることを考えると)。

于 2013-04-26T02:08:38.300 に答える
0

私をバックアップする「公式の」推奨事項はありませんが、私が常に最善を尽くしている方法は、可能な限りすべてのオプションです。これには、適切に名前を付けると、自動化されたランナーは、何が問題なのかをすぐに正確に伝えることができます。「testCallMethodWithAParticularEdgeCaseCalledFooShouldResultInBarOutput」が失敗した場合、問題は Foo エッジ ケースであることがわかります。

もちろん、多くのロギングを使用して自分でそれを行うこともできますが、メソッド名にそれを入れるだけでよいのに、なぜわざわざそれを行う必要があるのでしょうか。

また、テスト間の偶発的なブリードを防ぎます。テストが独立していることをより確実にすることができます。

編集: 別のテストが必要なもう 1 つの理由: JUnit を使用して、特定の例外がスローされた場合にテストを成功させることができます。失敗した場合に役立つため、try/catch ブロックをいじる必要はありません。

于 2013-04-26T01:40:22.057 に答える