「プログラミング」カテゴリーアーカイブ

JUnit 5 ユーザーズガイドを読む 3


JUnit 5 のユーザーズガイドを読みました。 公式ドキュメントのうち、重要そうなところをピックアップしてまとめています。 そのため公式ドキュメントにあってこちらにない文章もあります。 またその逆もあります。

この記事は JUnit 5 ユーザーズガイドを読む 2 からの続きです。

3 テストを書く

3.4 アサーション

3.4.1 サードパーティのアサーションライブラリ

JUnit Jupiter が提供するアサーションは多くのテストシナリオをカバーしますが、 より強力で付加機能を持った matchers のようなものが必要もしくは好ましい場合があります。 そのようなケースでは、 JUnit チーム は AssertJ, Hamcrast, Truth などの サードパーティアのサーションライブラリの使用を勧めます。 そのため開発者は自由にアサーションライブラリを選んで使うことができます。

たとえば、 matchers と流れるようなAPIとの組み合わせにより、 アサーションをより表現豊かに読みやすくすることができます。 しかしながら、 JUnit Jupiter の org.junit.jupiter.api.Assertions クラス は、 JUnit 4 で org.junit.Assert クラス にあるような、 Hamcrest の Matcher を受け付ける assertThat() メソッドを提供していません。 代わりに、 開発者はサードパーティのアサーションライブラリのための、ビルトインサポートを利用することが推奨されています。

次の例は JUnit Jupiter テスト で Hamcrest から assertThat() を使うサンプルです。 Hamcrast ライブラリ が クラスパスに追加されていれば、 assertThat()is(), equalTo() といったアサーションを静的にインポートすることができ、 テストの中で下のように assertWithHamcrestMatcher() のように使用できます。

依存関係解決 – Hamcrest の追加
Hamcrest を使用するサンプルコード (Kotlin)
Hamcrest を使用するサンプルコード (Java)

JUnit 4 のプログラミングモデルで作成されたレガシーなテストは、 org.junitAssert#assertThat を使い続けることができます。

3.4 アサンプション

アサンプションは、テストコードを実行する前に状況を確認し、テストを継続しても意味がない場合に テストを Abort させたり、 状況に応じてテスト内容を変更する機能です。 JUnit Jupiter は JUnit 4 が提供しているアサンプションメソッドのサブセットといくつかの Java 8 のラムダでうまく使えるメソッドです。 すべての JUnit Jupiter の アサンプションは org.junit.jupiter.Assumptions クラス の静的メソッドです。

サンプルコード (Kotlin)
サンプルコード (Java)

3.6 テストの無効化

@Disabled アノテーション または 条件付きテスト実行の項で議論するアノテーション、 カスタム ExecutionCondition を用いて テストクラス全体またはそれぞれのテストメソッドを無効化できます。

ここでは @Disabled をテストクラスに使ったコードを紹介します。

サンプルコード (Kotlin)
サンプルコード (Java)

@Disabled をテストメソッドに使うと次のようになります。

テストコード (Kotlin)
テストコード (Java)

3.7 条件付きテスト実行

JUnit Jupiter の ExecutionCondition エクステンション API を用いると ある条件に基づいたコンテナ及びテストを コードを用いて 有効 または 無効 にできます。 そのような条件のもっとも簡単な例は ビルトインの DisabledCondition で、 @Disabled アノテーションをサポートします。 @Disabled に加え、 JUnit Jupiter はほかにもいくつかのアノテーションに基づいた条件をサポートしています。 それらの条件は org.junit.jupiter.api.condition パッケージ にあり、 開発者はコンテナ及びテストを宣言的に(アノテーションを用いて)有効・無効にできます。

合成アノテーション
以下に記載されているすべての条件アノテーションは、独自の合成アノテーションを作るためのメタアノテーションとしても使用できます。 例えば、 @EnabledOnOs デモ にある @TestOnMac アノテーション は @Test@EnabledOnOs を単一の、再利用できるアノテーションに合成したものです。

下記セクションのそれぞれの条件アノテーションは、テストインターフェース、テストクラス、テストメソッドに一度だけ宣言できます。 もし条件アノテーションがある要素に直接的または間接的、メタ的に複数回使われている場合、 JUnit によって発見された最初のアノテーションのみが使われます。 追加のアノテーションは無視されます。 それぞれの条件アノテーションは他の条件アノテーションと複合的に使用可能です。

3.7.1 オペレーティングシステム条件

コンテナとテストは @EnableOnOs アノテーション, @DisabledOnOs アノテーション を用いて 特定のオペレーティングシステム上で有効化・無効化できます。

サンプルコード (Kotlin)

Java のサンプルコードは公式にあったものをそのまま掲載します。 クラスになっていないのでそのままでは動かないと思うのですが。

3.7.2 Java 実行環境条件

コンテナとテストは、 @EnableOnJre アノテーション、 @DisabledOnJre アノテーション を用いて、 特定の JRE 環境において有効化・無効化できます。

サンプルコード (Kotlin)

Java のサンプルコードは公式にあったものをそのまま掲載します。 クラスになっていないのでそのままでは動かないと思うのですが。

サンプルコード (Java)

3.7.3 システムプロパティ条件

コンテナとテストは、 @EnabledIfEnvironmentVariable アノテーション、 @DisabledIfEnvironmentVariable アノテーション の named 属性に指定された環境変数に応じて有効化・無効化できます。 matches 属性 に渡された値は正規表現として扱われます。

サンプルコード (Kotlin)

Java のサンプルコードは公式にあったものをそのまま掲載します。 クラスになっていないのでそのままでは動かないと思うのですが。

サンプルコード (Java)

3.4.4 スクリプトベース条件

JUnit Jupiter では コンテナとテストを @EnabledIf アノテーション、 @DisabledIf アノテーション を使い、 スクリプトの評価値に応じて有効化・無効化できます。 スクリプトは JavaScript, Groovy をはじめその他の JSR 223 で定義された JavaScript API をサポートそいているスクリプト言語で記述できます。

@EnabledIf アノテーション、 @DisabledIf アノテーション を使ったテストの実行は試験的機能です。 試験的機能について、詳しくは試験的APIの表を参照してください。

もし、記述したスクリプトがOS や JRE バージョン、 特定の JVM システム プロパティ、 特定の環境変数などに依存する場合は、 他のアノテーションの使用を検討したほうがいいです。

もし同じスクリプトベースの条件を複数回使用する場合は、 後述する ExecutionCondition 拡張 の記述を検討しましょう。 実行が速くなり、タイプセーフで、メンテナンスしやすくなります。

サンプルコード (Kotlin)

Java のサンプルコードは公式にあったものをそのまま掲載します。 クラスになっていないのでそのままでは動かないと思うのですが。

サンプルコード (Java)
スクリプト バインディング

次の名前は、各スクリプトコンテキストでバインドされているため、スクリプト内で使用可能です。 アクセサは、単純な String get(String name) メソッドで、 マップのようなアクセスを実現しています。

名前 説明
systemEnvironment アクセサ OSの環境変数へのアクセサ。
systemProperty JVM のシステムプロパティへのアクセサ。
junitConfigurationParameter 設定パラメータへのアクセサ。
junitDisplayName String テストおよびコンテナの表示名。
junitTags Set<String> テストまたはコンテナに付与されたタグ名。
junitUniqueId String テストまたはコンテナの一意のID。

プログラミング: 切り捨てが floor, 切り上げが ceil になのはなぜか


多くのプログラミング言語で、数値の切り捨てfloor, 切り上げceil という関数で実現できるようになっています。 これをなかなか覚えられないという方もいると思いますので、確実に思い出せるようにするために、その理由を解説しました。

続きを読む プログラミング: 切り捨てが floor, 切り上げが ceil になのはなぜか

機械学習と深層学習 Python によるシミュレーション kpga.py


機械学習と深層学習 Pythonによるシミュレーション の第3章の遺伝的アルゴリズムのコード kpga.pyについて、 わかりやすく書き換えてみました。

続きを読む 機械学習と深層学習 Python によるシミュレーション kpga.py