web-dev-qa-db-ja.com

単体テストの書き方

Javaクラスがあります。どうすれば 単体テスト それできますか?


私の場合は、クラスで二項和をとります。これは2つのbyte[]配列を取り、それらを合計して新しいバイナリ配列を返します。

123
Tsundoku
  1. 正しい入力で、通常の場合の予想される出力と望ましい出力を定義します。

  2. それでは、クラスを宣言してテストを実装し、それに何か名前を付け(通常はTestAddingModuleのようなもの)、それにtestAddメソッドを追加します(すなわち、以下のように)。

    • メソッドを書き、その上に@Testアノテーションを追加します。
    • メソッド内で、バイナリ和とassertEquals(expectedVal,calculatedVal)を実行します。
    • メソッドを実行してテストします(Eclipseで、右クリックし、「別のユーザーとして実行」→「JUnitテスト」の順に選択します)。

      //for normal addition 
      @Test
      public void testAdd1Plus1() 
      {
          int x  = 1 ; int y = 1;
          assertEquals(2, myClass.add(x,y));
      }
      
  3. 必要に応じて他のケースを追加してください。

    • 整数のオーバーフローが発生した場合でも、バイナリの合計が予期しない例外をスローしないことをテストしてください。
    • メソッドがNull入力を適切に処理することをテストします(以下の例)。

      //if you are using 0 as default for null, make sure your class works in that case.
      @Test
      public void testAdd1Plus1() 
      {
          int y = 1;
          assertEquals(0, myClass.add(null,y));
      }
      
120
jayunit100

プロジェクトの単体テストを作成するには、次の手順に従ってください(私はこのテストを書くためにEclipseを使用しています)。

1 - [新規] - > [Javaプロジェクト]をクリックします。

Create Project

2-プロジェクト名を書き留めて、Finishをクリックします。

Create Project

3-あなたのプロジェクトを右クリックします。次に、New - > Classをクリックします。

Create Class

4-クラス名を書き留めて、Finishをクリックしてください。

Create Class

次に、このようにクラスを完成させます。

public class Math {
    int a, b;
    Math(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int add() {
        return a + b;
    }
}

5- [ファイル] - > [新規] - > [JUnitテストケース]をクリックします。

Create JUnite Test

6- setUp()をチェックしてFinishをクリックしてください。 SetUp()はテストを初期化する場所になります。

Check SetUp()

7 - [OK]をクリックします。

Add JUnit

8-ここで、私は単に7と10を加えます。それで、私は答えが17であると思います。このようにあなたのテストクラスを完成させてください:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class MathTest {
    Math math;
    @Before
    public void setUp() throws Exception {
        math = new Math(7, 10);
    }
    @Test
    public void testAdd() {
        Assert.assertEquals(17, math.add());
    }
}

9 - パッケージエクスプローラーでテストクラスをクリックして実行し、Run - > JUnit Testをクリックします。

Run JUnit Test

10-これはテストの結果です。

Result of The Test

助けになれば幸いです。

80
Vahid

これは非常に一般的な質問であり、それに答えることができる方法はたくさんあります。

JUnitを使用してテストを作成したい場合は、テストケースクラスを作成してから、テスト中のクラス/モジュールの特定の機能をテストする個々のテストメソッドを作成する必要があります。これらのメソッドの内部ではさまざまな操作を実行し、結果を正しいものと比較します。可能な限り多くのコーナーケースを試してカバーすることが特に重要です。

あなたの具体的な例では、たとえば次のようにテストできます。

  1. 2つの正数の間の単純な加算それらを追加し、そして結果があなたが期待するものであることを確認してください。
  2. 正数と負数の間の加算(最初の引数の符号付きの結果を返します)。
  3. 正数と負数の間の加算(2番目の引数の符号付きの結果を返します)。
  4. 2つの負数の間の加算.
  5. オーバーフローを引き起こす追加。

結果を検証するために、org.junit.AssertクラスからさまざまなassertXXXメソッドを使用できます(便宜上、 'import static org.junit.Assert。*'を実行できます)。これらのメソッドは特定の条件をテストし、検証できない場合はテストを失敗させます(オプションで特定のメッセージを使用)。

あなたの場合のテストケースクラスの例(メソッドの内容は定義されていません):

import static org.junit.Assert.*;

public class AdditionTests {
    @Test
    public void testSimpleAddition() { ... }


    @Test
    public void testPositiveNegativeAddition() { ... }


    @Test
    public void testNegativePositiveAddition() { ... }


    @Test
    public void testNegativeAddition() { ... }


    @Test
    public void testOverflow() { ... }
}

単体テストを書くことに慣れていないが、代わりに「視覚的に」検証するアドホックテストを書くことでコードをテストします(たとえば、キーボードを使用して入力された引数を受け入れて結果を出力する単純なmainメソッドを書きます)。それから値を入力し続け、結果が正しいかどうかを自分で検証します。それから、そのようなテストを上の形式で書いて、手動ではなく正しいassertXXXメソッドで結果を検証することから始めることができます。このようにして、手動テストをしなければならなかった場合よりもずっと簡単にテストを再実行することができます。

16
Seramme

@CoolBeansが述べたように、 jUnit を見てください。 jUnit 4.xを使い始めるには、これが短い チュートリアル です。

最後に、テストとテスト駆動開発(TDD)についてもっと詳しく知りたい場合は、Kent Beck著の次の本をご覧になることをお勧めします。 例によるテスト駆動開発

7
vladmore

他の回答では、JUnitを使用してテストクラスを設定する方法を説明しました。 JUnitが唯一のJavaテストフレームワークではありません。しかし、フレームワークを使用することの技術的な詳細に集中することはあなたの行動を導くべきである最も重要な概念を損なうので、私はそれらについて話すつもりです。

  • テスト(あらゆる種類のあらゆる種類のもの)は、あるもの(テスト対象のシステム、SUT)の実際の動作をその予想される動作と比較します。

  • 自動試験はコンピュータープログラムを用いて行うことができる。その比較は柔軟性がなくわかりにくいコンピュータプログラムによって行われているので、予想される動作は正確かつ明確に知られていなければなりません。

  • プログラムまたはプログラムの一部(クラスまたはメソッド)に期待されることは、仕様です。したがって、ソフトウェアをテストするには、SUTの仕様があることが必要です。これは、明示的な説明、または予想されることに関するあなたの頭の中の暗黙の指定かもしれません。

  • そのため、自動ユニットテストでは、テストするクラスまたはメソッドを正確かつ明確に指定する必要があります。

  • しかし、そのコードを書き始めるときには、その仕様が必要でした。ですから、実際にテストが行​​われていることの一部は、SUTを1行も書く前に始まります。テスト駆動開発(TDD)のテスト技術は、その考えを極端に取り入れ、テストするコードを書く前に単体テストコードを作成します。

  • 単体テストフレームワークは、assertionを使用してSUTをテストします。アサーションは論理式(booleanname__結果タイプを持つ式、述語)で、SUTが正しく動作している場合はtruename__でなければなりません。そのため、仕様はアサーションとして表現(または再表現)する必要があります。

  • 仕様をアサーションとして表現するための便利なテクニックは、契約によるプログラミングです。これらの指定は事後条件という意味です。事後条件は、メソッドまたはコンストラクタから戻った後のSUTの公開されている状態についてのアサーションです。いくつかのメソッドは、invariantsという事後条件を持ちます。これは、メソッドの実行前後に当てはまる述語です。 classは、クラスのすべてのコンストラクタとメソッドの事後条件である不変式を持つとも言えます。したがって、alwaysが成り立つはずです。事後条件(および不変式)は、publicname__およびprotectedname__フィールド、publicname__およびprotectedname__メソッドによって返される値(gettersなど)、およびメソッドに(参照によって)渡されたオブジェクトの公開された表示状態という観点からのみ表現されます。 。

多くの初心者がここでいくつかのコードをテストすることができるかどうかを尋ねる質問を投稿して、そのコードを提示するがそのコードの仕様を述べることなしに。この議論が示すように、だれでもがそのような質問に良い答えを出すことは不可能です。なぜなら、せいぜい潜在的な答えは推測でなければならず、間違ってするかもしれないからです。質問の質問者は明らかに仕様の重要性を理解していないので、ここで説明した基本を理解する必要がある初心者です以前書くことを試みるテストコード.

1
Raedwald