JUnitは、サードパーティのオープンソース単体テストフレームワークです。このプロジェクトは、1995年後半にKentBeckとErichGammaによって開始されました。このプロジェクトは、特にテスト駆動開発を扱う開発者のコミュニティにすぐに関心を集めました。 JUnitは当初Smalltalkに導入されましたが、後にJavaに移植され、Javaはこれをユニットテストのデファクトスタンダードとしてすぐに採用しました。 JUnitの人気は、C#、Perl、Python、PHP、Ruby、Visual Basic、C ++などの他の多くの現代言語のニーズに応えるために、文字が'x'は、Javaの場合はJUnit、Rubyの場合はRUnitなど、言語の最初の文字に置き換えられます。この記事では、Java単体テストのデファクトスタンダードで使用されるこのフレームワークの概要を説明します。
テストの概要
テストは、アプリケーション開発のライフサイクルにおける重要なフェーズです。テストの主な目的は、必要な仕様に基づいてプログラムを評価することです。目標は、エラー、ギャップ、不一致、または予期しない結果を可能な限り表面化する特定のテストケースを作成することです。この単純な概念には、いくつかの複雑なプロセスが関連付けられています。しかし、簡単に言えば、それは3つのレベルで行われます。テストが非常に詳細な、または個々のコンポーネントレベルで行われる場合、それは単体テストと呼ばれます。;これらを組み合わせてコンポーネント間のインターフェイスをソフトウェア設計と照合する場合、統合テストと呼ばれます。;最後に、システム全体が統合され、システム全体が指定された要件を満たしていることを確認するためのテストが行われる場合、それはシステムテストと呼ばれます。 。
ユニットテスト
一言で言えば、単体テストを実行することは、コードの個別の単位の動作を調べる方法です。 Javaでは、コードの単位 コンテキストに応じて、メソッド、クラス、またはモジュールを意味する場合があります。たとえば、メソッドの場合、テストの焦点は、メソッドの呼び出しが許可されている適切なオブジェクト参照、パラメーターのタイプと許容値、プリミティブ値の範囲、戻り値のタイプと値などを評価することです。アイデアは、メソッドをグリルして、問題を適切に処理し、その範囲を超えているものを契約の履行とは別に捨てるのに十分な堅牢性を実現できるようにすることです。
したがって、単体テストは、プログラム評価の基本的な構成要素を形成します。実際、すべてのプログラマーは、ダミーのデータ/ケースを使用してコードの結果をチェックするコードを作成するときに、ある種の単体テストを実行します。したがって、単体テストは、その分離されたテストのコレクションに与えられる正式なステータスです。コードがテストのさまざまなフェーズの厳密さを通過することは非常に重要です。ユニットテストは、その重要性は別として、非常に一般的でもあります。 KentBeckやErichGammaなどの人々は、プログラマーが構造化された環境を取得し、これらのタスクの多くを自動化できるように、フレームワークを作成することを考えました。結局のところ、これがフレームワークの目的です。通常、アプリケーション間で再利用および共有できる一貫性のあるプログラム構造を提供します。プログラマーはそれらを既存のアプリケーションに組み込み、特定のニーズに応じて拡張することができます。
簡単な例
Temperatureの単一のメソッドを調べるための単純な単体テストコード JUnitフレームワークを使用しないクラスは次のとおりです。
package org.mano.unittest.examples; public class Circle { double area(double radius) { returnMath.PI* radius * radius; } }
それでは、領域を単体テストするコードを記述しましょう。 メソッド。
package org.mano.unittest.examples; public class CircleTest { public int errCounter= 0; public void testCircleArea() { Circle circle = new Circle(); double area = circle.area(12); if (area < 452 && area > 453) { throw new IllegalStateException("Wrong calculation!: " + area); } } public static void main(String[] args) { TestCircle test = new TestCircle(); try { test.testCircleArea(); } catch (Throwable e) { test.errCounter++; e.printStackTrace(); } if (test.errCounter> 0) { throw new IllegalStateException("There were " + test.errCounter+ " error(s)"); } } }
これは基本的な例ですが、フレームワークを使用せずに単体テストを実行する方法についてのアイデアを提供します。
JUnitテストフレームワーク
単体テストにJUnitフレームワークを使用すると、いくつかの利点があります。 Javaでのテストコードの記述と実行を容易にする多数のアノテーションを提供します:
- 主に、単体テストごとにテストクラスインスタンスとクラスローダーを作成できるようにすることで、単体テストの問題を実際のプロジェクトコードから分離します。これらは、テストの不要な副作用から既存のコードを「免除」します。
- JUnitによって提供されるアノテーション( @ Before、@ After、@ BeforeClass、@ AfterClass など) -リソースの初期化とリソースの再利用の両方のメソッドがあります。
- テストの結果を検証するためのさまざまなassertメソッドがあります。
- 何年にもわたって、JUnitは非常に人気が高くなり、 Antなどの多数のJavaツールが使用されるようになりました。 およびMaven; Eclipseなどの一般的なIDE 、 NetBeans 、 IntelliJ IDEA 、などには、JUnitの統合が組み込まれています。
JavaプロジェクトでJUnitTestFrameworkを使用するには、プロジェクトのクラスパスにJUnitJARファイルを追加する必要があります。 IDEがJUnitライブラリと統合されていない場合、これは明示的に必要です。プロセスは簡単です。 JARファイルをダウンロードして、プロジェクトのクラスパスに追加します。
JUnitフレームワークへの重要なリンクは次のとおりです。
- JUnit公式サイト
- JUnit Java API
- JUnitユーザーガイド
- GitHubのJUnitソースコード
JUnit 4およびその前身とは異なり、JUnit5はいくつかの重要な変更をもたらしました。ラムダのサポート、新しいアノテーション、テストメソッドのパラメータインジェクションなど、追加された多くの新機能とは別に、コアアーキテクチャにいくつかの重要な変更が加えられました。 JUnit 5は、JUnit Jupiter、JUnit Vintage、およびJUnitPlatformの3つの異なるモジュールの複合アーキテクチャーになりました。ただし、テストケースの開発者は、変更の複雑さを気にする必要はありません。この変更は主に、ツールのサポート、一貫性、APIのクリーン化を意味します。とりわけ、JUnit 4と完全な下位互換性があります。したがって、そこにも心配はありません。詳細については、JUnit5ユーザーガイドを参照してください。
簡単な例
これは、JUnitフレームワークを使用して単体テストを実行する方法を垣間見るための非常に簡単な例です。 従業員を使用します 単体テストのクラスを作成し、その動作のアイデアを与えるためのテストクラスを作成します。この例は、「HelloWorld」プログラムを作成する程度の初歩的なものです。実際のテストケース、または単体テストのまともな例でさえ、かなりの量のコードを必要とします。たぶん、他の記事でそれを試してみます。
package org.mano.unittest.examples; public class Employee { private final String name; private final double basicPay; public Employee(String name, double basicPay) { this.name=name; this.basicPay=basicPay; } public String getName() { return name; } public double getBasicPay() { return basicPay; } } package org.mano.unittest.examples; import org.junit.Test; import static org.junit.Assert.*; public class EmployeeTest { @Test public void constructorInitTest(){ Employee emp=new Employee("Odin", 2300); assertEquals("Odin", emp.getName()); assertEquals(2300, emp.getBasicPay(), 0.001); } } package org.mano.unittest.examples; public class EmployeeTestMain { public static void main(String[] args){ EmployeeTest et=new EmployeeTest(); et.constructorInitTest(); } }
Employeeクラスは、コンストラクターによって設定された2つのフィールドのみで不変であることに注意してください。テストする価値があるのは建設業者の方法だけなので、それだけをテストします。
テストクラスの名前はEmployeeTest 慣例に従って。アノテーション@Test JUnitがメソッドをテストメソッドとして指定できるようにします。 Assert には、さまざまなassertメソッドがあります。 クラス。ここでは、 assertEqualsのみを使用しました 。
JUnitで記述されたテストを実行する方法はたくさんあります。通常、テストケースの実行後、要約が出力されます。ただし、テストの実行方法によって異なる場合があります。 EclipseやIntelliJなどのIDE、またはMaven、Gradleなどのツールを介して実行される場合があります。場合によっては、テスト後に受け取った情報は、テストが失敗したか合格したということだけです。
結論
ユニットテストには他にもいくつかのフレームワークがあります。 JUnitは、JavaCommunityの間で人気のある単体テストフレームワークです。システムエンジニアリングフェーズとしてのテストには、さらに多くのプロセスが含まれます。単体テストはその一部にすぎず、興味深いことに、開発者が行う多くのプレイテストは単体テストと呼ぶことができます。 JUnitは、テストフレームワークとして、それに価値を付加します。 JUnitによって提供されるアノテーションとAPIは、多くのタスクを自動化し、単体テスト開発者の作業を大幅に楽にします。