このセクションの内容

全般

コマンド ラインの使用方法をすばやく参照する方法

-help コマンド ライン オプションを使用します。

jtestcli.exe -help

プロキシ経由で Jtest を操作する方法

プロキシ サーバー経由で接続する場合、通常、-D コマンド ライン オプションを使用して JVM にプロトコル固有のシステム プロパティを渡して接続する必要があります。


 Jtest を操作する場合、HTTPS プロトコルのシステム プロパティが設定されていることを確認してください。最低でも、https.proxySet=truehttps.proxyHost=[hostname]https.proxyPort=[port number] を設定する必要があります。プロキシ サーバーが認証を要求する場合、https.proxyUser および https.proxyPassword プロパティを使用して認証情報を設定できます。

コマンドは次のようになります。

java -Dhttps.proxySet=true -Dhttps.proxyHost=myserver.example.com -Dhttps.proxyPort=8080 -Dhttps.proxyUser=user1 -Dhttps.proxyPassword=MyPassword

また、https.nonProxyHosts プロパティを使用すると、プロキシ経由で接続する必要がないホストを指定できます。

(info) Eclipse または IntelliJ IDEA とともにデスクトップで Jtest を使用する場合、プロキシ設定は自動的に検出されるため、コマンド ラインで設定する必要はありません。

インストール

マシン ID が変わってしまうのを防ぐ方法

ネットワーク環境が変わると、マシン ID の計算に使用されるインターフェイスが変わり、結果としてマシン ID が一定でなくなる可能性があります。PARASOFT_SUPPORT_NET_INTERFACES 環境変数を使用すると、安定したインターフェイスを指定し、マシン ID が変化するのを防ぐことができます。

  1. PARASOFT_SUPPORT_NET_INTERFACES 環境変数を作成します。
  2. 変数に安定した Ethernet ネットワーク インスタンスを指定します。仮想インターフェイス、一時インターフェイス、ループバック インターフェイスは使用しないでください。
    - Windows の場合: ネットワーク カードの MAC アドレスを指定します。ipconfig -all コマンドを実行すると、アドレスを取得できます。  例:

    SET PARASOFT_SUPPORT_NET_INTERFACES=00-10-D9-27-AC-85

    - Linux の場合: "inet" または "inet6" ファミリーのいずれかのネットワーク インターフェイスを指定します。ifconfig コマンドを実行すると、利用可能なインターフェイスのリストを取得できます。例: 

    export PARASOFT_SUPPORT_NET_INTERFACES=eth1

問題が解決しない場合、PARASOFT_DEBUG_NET_INTERFACES 環境変数を作成して true を指定すると、診断情報を取得できます。テクニカル サポートに送信可能なチェック手順や、マシン ID の計算に使用されているインターフェイスが標準出力に表示されます。マシン ID の計算に使用されているインターフェイスには [SELECTED] という接頭辞が付きます。

テストおよび解析

Jtest を新しいバージョンにアップデートした後に静的解析のパフォーマンスが悪くなった場合

新しいバージョンの Jtest は、静的解析の実行により多くのメモリを必要とする場合があります。[INSTALL_DIR]/etc/jtestcli.jvm 設定ファイルで -Xmx オプションを設定することで、メモリの割り当てを増やすことが出来ます。

Maven でプロジェクトをビルドしたとき、Jtest がコンパイルの問題をレポートする

Jtest が Maven テスト スコープの依存関係のインポートに関するコンパイルの問題をレポートした場合、mvn test コマンドで jtest:jtest ゴール を実行してください。

mvn test jtest:jtest

jtest:coverage ゴール (Maven) または jtest-coverage タスク (Gradle) を実行するとビルドが失敗する

Jtest の coverage ゴール/タスクはリリース 10.2.2 (プラグイン バージョン 1.2.4) で削除され、利用できなくなりました (「10.x から 10.2.2 以降への移行」を参照)。このゴールを実行すると、次のメッセージでビルドが失敗します。

[ERROR] Could not find goal 'coverage' in plugin com.parasoft.jtest:jtest-maven-plugin.(Maven)

Task 'jtest-coverage' not found (Gradle)

Jtest でテスト影響分析を実行するよう設定したとき、Gradle のビルドが失敗する

Jtest を使用してマルチモジュール プロジェクトのテスト影響分析を実行する場合、サブモジュールにテスト影響分析時に影響を受けるテストとして検出されるテストがないと、Gradle のビルドが失敗する場合があります。テストが検出されなかった場合に Gradle のビルドが失敗するのを防ぐには、次のオプションを設定します:
setFailOnNoMatchingTests(false)

Jtest が Gradle によるテスト実行からカバレッジを収集できない場合

カバレッジの収集を可能にするため、Jtest は Jtest カバレッジ エージェントの JVM 引数を自動的に設定します。これらの引数を上書きすると、Jtest はカバレッジ データを収集できません。Gradle のビルド スクリプトで JVM 引数を変更している場合、上書きを防ぐために、(+=) で他の引数に追加されていることを確認してください。

(error) jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'ALL-MODULE-PATH',
'--add-reads', "$moduleName=junit",
'--patch-module', "$moduleName=" + files(sourceSets.test.java.outputDir).asPath

]

(tick) jvmArgs += [
'--module-path', classpath.asPath,
'--add-modules', 'ALL-MODULE-PATH',
'--add-reads', "$moduleName=junit",
'--patch-module', "$moduleName=" + files(sourceSets.test.java.outputDir).asPath

]

Maven による解析実行時またはテスト実行時に Jtest が必要な依存関係を解決できない場合

必要な依存関係がすべて解決されるよう、コマンド ラインに次のオプションを追加して中間的な依存関係を解決する必要がある場合があります。

-Djtest.resolve.transitive=true

Maven を使用したテスト影響分析が、コードの変更の影響を受けないテストを再実行する

  • テスト影響分析は、テスト スイート内の少なくとも 1 つのテストがコードの変更の影響を受ける場合、テスト スイート全体を再実行します。結果として、テスト スイートに影響を受けないテストが含まれている場合、それらも再実行されます。
  • まれに、テスト影響分析がインクルードまたはエクスクルード パターンを認識できない場合があります。  回避策としては、手動でテストをフィルタリングできます。詳細は「再実行するテストを手動でフィルタリングする」を参照してください。

テキスト ストリームの先頭にバイト オーダー マーク (BOM) が現れるソース ファイルをテストする方法

BOM を含むファイルが適切に処理され、テストされるようにするには、ファイルをパースするときに BOM を削除するよう Jtest を設定します。それには、jtest.properties 設定ファイルに以下のどちらかの設定を追加します。

  • jtest.parser.bom=remove - BOM を削除し、元のファイル エンコーディングをそのままにします。
  • jtest.parser.bom=recognize - BOM を削除し、元のファイル エンコーディングを BOM によって定義されたエンコーディングで上書きします。

Maven または Gradle でのテスト実行時に Jtest が不安定なテストを失敗としてレポートする場合

デフォルトでは、Jtest は実行時に常に失敗するテストと成功したり失敗したりするテスト (不安定なテスト) を区別しません。 非推奨の XML 処理メカニズムを使用したテスト実行を有効にすると、不安定なテストを認識するよう設定できます。 それには、jtestcli.properties 設定ファイルに次のオプションを追加します。

jtest.unittest.xml.results.processing.enabled=true

非推奨の XML 処理メカニズムを有効にすると、テスト実行が遅くなる可能性があることに注意してください。

mockito-inline とともに PowerMock を実行したときにテストが失敗する場合

クラスパスで powermock の前に mockito-inline がある状態で PowerMock テストを実行すると、次の例外でテストが失敗する場合があります。

NotAMockException: Argument should be a mock, but is: class java.lang.Class

これは、PowerMock が mockito-inline のモック メーカーと連携する際の問題によって発生します (詳細は「PowerMock の問題」を参照)。 

ユーザーの要件に応じていくつかの解決策があります。

モックできるクラスおよびメソッドに関して一部制限があります。詳細は、「Mockito による static およびコンストラクターのモックの制約」を参照してください。

PowerMock テストのアップデート (static モック) - サンプル

次の PowerMock の呼び出しは、容易に修正可能な問題を発生させます。

  • thenReturn()
  • doReturn()
  • doNothing()

例:

PowerMockito.when(MyClass.staticCall(any())).thenReturn("value");
PowerMockito.when(MyClass.staticCall(any())).thenReturn("value1", "value2");
PowerMockito.doReturn("value").when(MyClass.class);
MyClass.staticCall(any());
PowerMockito.doNothing().when(MyClass.class, "staticCall", any());

アップデート後のコード:

PowerMockito.when(MyClass.staticCall(any())).thenAnswer(invocation -> "value");
PowerMockito.when(MyClass.staticCall(any())).thenAnswer(invocation -> "value1").thenAnswer(invocation -> "value2");
PowerMockito.doAnswer(invocation -> "value").when(MyClass.class);
MyClass.staticCall(any());
PowerMockito.doAnswer(invocation -> null).when(MyClass.class, "staticCall", any());

PowerMock テストのアップデート (検証) - サンプル

verifyStatic() または verifyPrivate() を呼び出した場合、次のテスト例外が発生する可能性があります。

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type Class and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();

コードをリファクタリングし、手動で必要な呼び出しを検証する必要があります。 

例:

PowerMockito.when(MyClass.staticCall(any())).thenAnswer(invocation -> "value");
...
PowerMockito.verifyStatic(MyClass.class, times(1));
MyClass.staticCall(any());

アップデート後のコード:

int counter[] = new int[]{0};
PowerMockito.when(MyClass.staticCall(any())).thenAnswer(invocation -> {
    counter[0]++;
    return "value";
});
...
assertEquals(1, counter[0]);

verifyPrivate() の場合、Mockito は private メソッドのモックをサポートしていないため、唯一の解決方法は、必要な呼び出しを手動で検証することです。

例:

PowerMockito.mockStatic(MyClass.class);
PowerMockito.when(MyClass.class, "privateStatic", any()).thenAnswer(invocation -> inv.callRealMethod());
...
PowerMockito.verifyPrivate(MyClass.class, times(1)).invoke("privateStatic");

アップデート後のコード:

PowerMockito.mockStatic(MyClass.class);
int counter[] = new int[]{0};
PowerMockito.when(MyClass.class, "privateStatic", any()).thenAnswer(invocation -> {
    counter[0]++;
    return inv.callRealMethod();
});
...
assertEquals(1, counter[0]);

PowerMock テストの Mockito への書き換え (static モック) - サンプル

PowerMock のコード:

PowerMockito.mockStatic(MyClass.class);
PowerMockito.when(MyClass.staticCall(any())).thenReturn("value");
// test code
PowerMockito.verifyStatic(MyClass.class, times(1));
MyClass.staticCall(any());

Mockito に変換後のコード:

try (MockedStatic<FunctionsToMock> mocked = mockStatic(FunctionsToMock.class)) {
    mocked.when(() -> FunctionsToMock.staticCall(any())).thenReturn("value");
    // test code
    mocked.verify(() -> FunctionsToMock.staticCall(any()), times(1));
}

PowerMock テストの Mockito への書き換え (コンストラクターのモック) - サンプル

PowerMock のコード:

FunctionsToMock mock = Mockito.mock(FunctionsToMock.class);
PowerMockito.whenNew(FunctionsToMock.class).withAnyArguments().thenReturn(mock);
when(mock.calculate()).thenReturn(1);
// test code

Mockito に変換後のコード:

try (MockedConstruction<FunctionsToMock> mocked = mockConstruction(FunctionsToMock.class, (mock, context) -> {
    when(mock.calculate()).thenReturn(1);
})) {
    // test code
}

Mockito による static およびコンストラクターのモックの制約

以下のケースは Mockitoではサポートされていません。

  • private メソッドは、Mockito ではモックできません。
  • Mockito の内部構造と干渉しないよう、次のクラスは static およびコンストラクター モック化されません。
    • java.lang.ClassLoader
    • java.lang.Thread
    • java.lang.Object
    • java.lang.System
    • java.util.Arrays
    • java.util.Locale
    • java.util.concurrent.ConcurrentHashMap
    • 抽象クラス

Mockito は JDK のクラスを static モックすることも推奨していません。

  • これらのクラスをモックすると、スタック オーバーフロー例外やその他の無限ループが発生する可能性があります。
    • java.io.File

ソース管理システムとテスト入力でファイルの名前が違っているためにファイルをテストできない場合

ファイルを適切に処理し、解析するには、 Jtest がテスト スコープのファイル名 (プロジェクト内のファイル名) とソース管理システムのファイル名を照合できなければなりません。そのため、Git などの大文字と小文字を区別するソース管理システムを使用している場合は、ファイル名の大文字/小文字も同一であることを確認する必要があります。

レポート

Jtest レポートで一部の文字が正しく表示されない場合

Parasoft 製品によって生成されたレポートを使用するには、環境に sans-serif フォントがある必要があります。国別文字などの一部の文字がレポートで正しく表示されない場合は、システムに sans-serif フォントがインストールされていることを確認してください。

Maven を使用して Jtest を実行した後、レポートに課題トラッキング タグが表示されない

Jtest が 1 つまたはそれ以上の必要な依存関係を解決できない場合、設定済みの (「テストと開発成果物との関連付け」を参照) 課題トラッキング タグがレポートに表示されない場合があります。これを防ぐには、「Maven による解析実行時またはテスト実行時に Jtest が必要な依存関係を解決できない場合」を参照してください。

IDE での操作

UTA ファイルへのパスが 250 文字を超えるとテスト実行が失敗する

Windows では、パスが 250 文字より長いとファイルにアクセスできない場合があります。ネストされたフォルダー構造の深い場所にワークスペースがある場合、UTA ファイルへのパスが 250 文字を超える可能性があります。テスト実行の鍵になるファイルにアクセスできない場合、実行は失敗します。

UTA ファイルへのパスが制限を超えないよう、フォルダー階層のより上にワークスペース フォルダーを移動することを検討してください。

IntelliJ IDEA で Jtest のラン コンフィギュレーションが動作しない場合

一部の IntelliJ バージョンの既知の問題により、まれに、Jtest のラン コンフィギュレーションが動作しないケースがあります (詳細は https://youtrack.jetbrains.com/issue/IDEA-223124 を参照)。この問題が発生した場合、IDE を再起動する必要があります。再起動後、Jtest のラン コンフィギュレーションは正常に動作するようになります。

  • No labels