ホームページ Java &#&チュートリアル Java単体テストにおけるJUnitの詳細説明

Java単体テストにおけるJUnitの詳細説明

Sep 30, 2017 am 10:09 AM
java junit について

この記事では、Java 単体テストの詳細な説明である JUnit を主に紹介します。編集者が非常に優れていると考えたので、参考として共有します。エディターをフォローして見てみましょう

単体テストは、プログラムの基本モジュールの正しさを正確かつ迅速に確認するテスト コードを作成することです。

JUnit は、Eclipse にデフォルトでインストールされる Java 単体テスト フレームワークです。

JUnit4

JUnit4 は、アノテーションを通じてテストメソッドを識別します。現在サポートされている主なアノテーションは次のとおりです:

  • @BeforeClass グローバルは 1 回だけ実行され、最初の実行になります

  • @Before テスト メソッドが実行される前に実行します

  • @Test テスト メソッド

  • @ After は、テスト メソッドの実行後に許可されます

  • @AfterClass グローバルは 1 回だけ実行され、それが最後の実行になります

  • @Ignore このメソッドを無視します

以下はEclipse に基づく JUnit の基本アプリケーションの紹介

基本テスト

1. JUnitTest という新しいプロジェクトを作成します。これは、加算、減算、乗算を簡単に実装できる計算機クラスです。除算、平方根、平方根を計算し、これらの関数に対して単体テストを実行します。


public class Calculator {
  private static int result; // 静态变量,用于存储运行结果
  public void add(int n) {
    result = result + n;
  }
  public void substract(int n) {
    result = result - 1; //Bug: 正确的应该是 result =result-n
  }
  public void multiply(int n) {
  }     // 此方法尚未写好
  public void pide(int n) {
    result = result / n;
  }
  public void square(int n) {
    result = n * n;
  }
  public void squareRoot(int n) {
    for (; ;) ;      //Bug : 死循环
  }
  public void clear() {   // 将结果清零
    result = 0;
  }
  public int getResult(){
    return result;
  }
}
ログイン後にコピー

1. JUnit4 単体テスト パッケージをこのプロジェクトに導入します。図に示すように、プロジェクトを右クリックし、[プロパティ] をクリックします

まず、ポップアップ プロパティ ウィンドウで、下の図に示すように、左側の「ビルド パス」で「Java」を選択し、右上に移動して「ライブラリ」タブを選択し、右端にある「ライブラリの追加...」ボタンをクリックします


次に、新しいポップアップ ダイアログ ボックスで JUnit4 を選択し、[OK] をクリックします。上の図に示すように、JUnit4 ソフトウェア パッケージがプロジェクトに含まれています。
2. JUnit テスト フレームワークを生成する: Eclipse のパッケージ エクスプローラーでクラスを右クリックしてメニューを表示し、[新しい JUnit テスト ケース] を選択します。以下の図に示すように:



[次へ] をクリックすると、システムはクラスに含まれるメソッドを自動的にリストし、テストするメソッドを選択します。この例では、「加算、減算、乗算、除算」の 4 つのメソッドのみをテストします。

システムは、いくつかの空のテスト ケースを含む新しいクラス CalculatorTest を自動的に生成します。これらのテスト ケースを使用するには、わずかに変更するだけで済みます。
完全な Cal​​culatorTest コードは次のとおりです:


public class CalculatorTest {  
  private static Calculator calculator = new Calculator();

  @Before
  public void setUp() throws Exception {
    calculator.clear();
  }

  @Test
  public void testAdd() {
    calculator.add(3);
    calculator.add(4);
    assertEquals(7, calculator.getResult());

  }

  @Test
  public void testSubstract() {
    calculator.add(8);
    calculator.substract(3);
    assertEquals(5, calculator.getResult());

  }

  @Ignore("Multiply() Not yet implemented")
  @Test
  public void testMultiply() {
    fail("Not yet implemented");
  }

  @Test
  public void testpide() {
    calculator.add(8);
    calculator.pide(2);
    assertEquals(4, calculator.getResult());

  }

}
ログイン後にコピー

1. テスト コードを実行します。上記のコードを変更した後、CalculatorTest クラスを右クリックし、[Run As a JUnit Test] を選択してテストを実行します。図に示すように

実行結果は次のとおりです。

進行状況バーが赤色で表示され、エラーが見つかったことを示します。 進行状況バーの上に、特定のテスト結果が表示されます。合計 4 つのテストが実行され、1 つのテストが無視され、1 つのテストが失敗しました。」

期間限定テスト

複雑なロジックと深いループのネストを含むプログラムの場合、無限ループが発生する可能性が非常に高いため、いくつかの予防策を講じる必要があります。時間制限付きテストは優れたソリューションです。これらのテスト関数には実行時間が設定されており、この時間が経過すると、システムによって強制的に終了されます。また、システムは、関数が終了した理由がタイムアウトによるものであることを報告するため、これらのバグを見つけることができます。 。この関数を実装するには、@Test アノテーションにパラメーターを追加するだけです。コードは次のとおりです。


  @Test(timeout = 1000)
  public void squareRoot() {
    calculator.squareRoot(4);
    assertEquals(2, calculator.getResult());
  }
ログイン後にコピー

Timeout パラメーターは、設定する時間をミリ秒単位で示すため、1000 は 1 秒を表します。 。


测试异常

JAVA中的异常处理也是一个重点,因此你经常会编写一些需要抛出异常的函数。那么,如果你觉得一个函数应该抛出异常,但是它没抛出,这算不算Bug呢?这当然是Bug,并JUnit也考虑到了这一点,来帮助我们找到这种Bug。例如,我们写的计算器类有除法功能,如果除数是一个0,那么必然要抛出“除0异常”。因此,我们很有必要对这些进行测试。代码如下:


 @Test(expected = ArithmeticException.class)
 public void pideByZero(){
    calculator.pide(0);
  }
ログイン後にコピー

如上述代码所示,我们需要使用@Test标注的expected属性,将我们要检验的异常传递给他,这样JUnit框架就能自动帮我们检测是否抛出了我们指定的异常。

参数化测试

我们可能遇到过这样的函数,它的参数有许多特殊值,或者说他的参数分为很多个区域。

例如,测试一下“计算一个数的平方”这个函数,暂且分三类:正数、0、负数。在编写测试的时候,至少要写3个测试,把这3种情况都包含了,这确实是一件很麻烦的事情。测试代码如下:


  public class AdvancedTest { 
    private static Calculator calculator = new Calculator();
    @Before
    public void clearCalculator(){
      calculator.clear();
    }

    @Test
    public void square1() {
      calculator.square(2);
      assertEquals(4, calculator.getResult());
    }   

    @Test  
    public void square2(){
      calculator.square(0);
      assertEquals(0, calculator.getResult());
    }

    @Test  
    public void square3(){
      calculator.square(-3);
      assertEquals(9, calculator.getResult());
    }
   }
ログイン後にコピー

为了简化类似的测试,JUnit4提出了“参数化测试”的概念,只写一个测试函数,把这若干种情况作为参数传递进去,一次性的完成测试。代码如下:


  @RunWith(Parameterized.class)
  public class SquareTest{
    private static Calculator calculator = new Calculator();
    private int param;
    private int result;   

  @Parameters  
  public static Collection data() {
    return Arrays.asList(new Object[][]{
        {2, 4},
        {0, 0},
        {-3, 9},
    });
  }

  //构造函数,对变量进行初始化
  public SquareTest(int param, int result){
    this.param = param;
      this.result = result;
  }

  @Test  
  public void square(){
    calculator.square(param);
    assertEquals(result, calculator.getResult());
  }
 }
ログイン後にコピー

执行了3次该测试类,依次采用了数据集合中的数据{处理值,预期处理结果},结果如下:

代码分析如下:

  • 为这种测试专门生成一个新的类,而不能与其他测试共用同一个类,此例中我们定义了一个SquareTest类。

  • 为这个类指定一个Runner,而不能使用默认的Runner,@RunWith(Parameterized.class)这条语句就是为这个类指定了一个ParameterizedRunner

  • 定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。

  • 定义测试数据的集合,也就是上述的data()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。

  • 定义构造函数,其功能就是对先前定义的两个参数进行初始化

以上がJava単体テストにおけるJUnitの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles