VisualStudioで実行した単体テストの結果の出力(1)
ファイルへの出力
どもです。
最近、VisualStudio/C#でよく開発しています。
その際に、当然ですが単体テストを行ってカバレッジを測定する、ということを行います。
※VisualStudio/C#でのカバレッジ測定については、以下のエントリを参照して下さい。
Windowsでのカバレッジ測定 OpenCoverageを使ってみた
しかし、このやり方でも「効率悪いなぁ」と感じる箇所がありました。
今回のエントリでは、この「効率悪い」と感じた点と、その改善について書いていきます。
0.前提:開発環境
お約束ですが、本エントリの内容を確認した開発環境を示します。
OS | Windows10 Pro ver.1903 |
---|---|
CPU | i7-8700 |
IDE | VisualStudioCommunity2019 ver.16.5.1 |
.Net Core | 3.0 |
なお、本エントリでは、前回のエントリで公開したツールの一部のコードを対象にしています。
1.問題点
現在使用しているVisualStudioCommunity2019では、優秀なテストツール/フレームワークが使用可能です。
機能追加やバグの修正に伴うリグレッションテストも、ボタン一つで実行可能です。
テスト結果も、一目で確認ができます。
また、カバレッジ測定についても別途ツールを適用することで過去のエントリの通り確認ができます。
非常に素晴らしいです。
しかしこの環境でも、「1つだけ」問題(と私が感じている)点があります。
それは、「テスト結果の出力」です。
VisualStudio上でテストを実行した際は、「テストエクスプローラ上」で「成功/失敗」を確認できます。
しかし、「成功/失敗」はこの「テストエクスプローラ上」でのみ確認可能です。
即ち、VisualStudioを起動しないと確認ができません。
メンドクサイ
これが「問題」(と私が感じている)点です。
2.解決方法
この問題ですが、VisualStudioを起動せずにテストが実行できれば解決できると考えました。
そのための方法を調べよう…と思ったところ、テストを実行する方法が既に明らかになっていました。
その方法は、VisualStudio/C#でのカバレッジ測定エントリで書いていました。
すなわち、「vstest.console.exe」で単体テストを実行する、という方法です。
2.1.単体テストの実行
以下のようなバッチファイルを作成します。
@echo off
REM -----------------------------------------------------------
REM Run unit test using vstest.console.exe
REM -----------------------------------------------------------
setlocal
REM Setup environment variable to run unit test.
SET UTEST_TOOL=vstest.console.exe
SET VSCOMM_IDE=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\
SET UTEST_TOOL_FOLDER=CommonExtensions\Microsoft\TestWindow\
SET UTEST_TOOL_PATH="%VSCOMM_IDE%%UTEST_TOOL_FOLDER%%UTEST_TOOL%"
SET TEST_TARGET_DLL=UnitTest_Param.dll
SET TEST_TARGET_FOLDER=.\bin\Debug\netcoreapp3.0\
SET TEST_TARGET_PATH=%TEST_TARGET_FOLDER%%TEST_TARGET_DLL%
REM Run unit test
%UTEST_TOOL_PATH% %TEST_TARGET_PATH%
endlocal
このバッチファイルをダブルクリックなどで実行することで、VisualStudioを起動することなく単体テストの実行が可能です。
(なお、VisualStudioのインストール先については、自分の環境に合せて変更してください。)
コマンドラインで実行した場合には、下記のような結果が得られます。
Microsoft (R) Test Execution Command Line Tool Version 16.5.0
Copyright (c) Microsoft Corporation. All rights reserved.
テスト実行を開始しています。お待ちください...
合計 1 個のテスト ファイルが指定されたパターンと一致しました。
√ ParamTest_001 [5ms]
√ ParamTest_GetterSetter_001 [< 1ms]
√ ParamTest_GetterSetter_002 [< 1ms]
√ ParamTest_GetterSetter_003 [< 1ms]
√ ParamTest_GetterSetter_004 [< 1ms]
√ ParamTest_GetterSetter_005 [< 1ms]
√ ParamTest_GetterSetter_006 [< 1ms]
√ ParamTest_GetterSetter_007 [< 1ms]
√ ParamTest_GetterSetter_008 [< 1ms]
√ ParamTest_GetterSetter_009 [< 1ms]
√ ParamTest_GetterSetter_010 [< 1ms]
√ ParamTest_ToMode_001 [< 1ms]
√ ParamTest_ToMode_002 [< 1ms]
√ ParamTest_ToMode_003 [< 1ms]
√ ParamTest_ToMode_004 [< 1ms]
√ ParamTest_ToMode_005 [< 1ms]
√ ParamTest_ToMode_006 [< 1ms]
√ ParamTest_ToMode_007 [< 1ms]
テストの実行に成功しました。
テストの合計数: 18
成功: 18
合計時間: 0.7787 秒
なおテストが失敗する場合には、以下のような出力になります。
Microsoft (R) Test Execution Command Line Tool Version 16.5.0
Copyright (c) Microsoft Corporation. All rights reserved.
テスト実行を開始しています。お待ちください...
合計 1 個のテスト ファイルが指定されたパターンと一致しました。
√ ParamTest_001 [5ms]
√ ParamTest_GetterSetter_001 [< 1ms]
√ ParamTest_GetterSetter_002 [< 1ms]
√ ParamTest_GetterSetter_003 [< 1ms]
√ ParamTest_GetterSetter_004 [< 1ms]
√ ParamTest_GetterSetter_005 [< 1ms]
√ ParamTest_GetterSetter_006 [< 1ms]
√ ParamTest_GetterSetter_007 [< 1ms]
√ ParamTest_GetterSetter_008 [< 1ms]
√ ParamTest_GetterSetter_009 [< 1ms]
√ ParamTest_GetterSetter_010 [< 1ms]
X ParamTest_ToMode_001 [17ms]
エラー メッセージ:
Assert.AreEqual failed. Expected:<Out>. Actual:<In>.
スタック トレース:
at CStubMKGui.Model.Tests.ParamTests.ParamTest_ToMode_001() in E:\development\CStubMk\dev\dev\UnitTest_Param\Model\ParamTests.cs:line 155
√ ParamTest_ToMode_002 [< 1ms]
√ ParamTest_ToMode_003 [< 1ms]
√ ParamTest_ToMode_004 [< 1ms]
√ ParamTest_ToMode_005 [< 1ms]
√ ParamTest_ToMode_006 [< 1ms]
√ ParamTest_ToMode_007 [< 1ms]
テストの実行に失敗しました。
テストの合計数: 18
成功: 17
失敗: 1
合計時間: 0.7598 秒
このように、テストが失敗した場合でも、そのことが分かるような出力を得ることができます。
2.2.単体テストの実行結果の出力
VisualStudioの単体テストが、コマンドラインから実行できることが分かりました。
また、テスト結果も表示できています。
そこで次に、このテスト結果をファイルに出力します。
というか、してみたくなります。
テスト結果をファイルに出力するためには、「vstest.console.exe」に以下のような引数を与えます。
/logger:trx;LogFileName=utest_result.xml
(上記の引数の詳細、およびそれ以外の引数については、Microsoftのページを参照して下さい。)
「LogFileName」には、任意のファイル名を設定できます。
この引数を追加して上記バッチに追記して実行すると、TestResultsフォルダ内に指定したファイルが生成されます。
このファイルの中に、各テストの実行結果が記録されています。
「UnitTestResult」タグの「outcome」属性の値が「成功/失敗」に対応しており、この値が「Passed」なら「成功」、「Failed」なら「失敗」となります。
加えて「失敗」の場合には、テストのどのASSERTで失敗しているかも表示されます。
3.まとめ
今回のエントリでは、VisualStudioでの(C#の)単体テストをVisualStudioを起動せずにバッチファイルから実行し、結果をファイルに出力する方法を書きました。
この方法により、本エントリの最初で提起した問題を十二分に解決できた、効率の悪さを完全に改善できたとは言えないと思います。
そのため、次回のエントリでは、また「完全に改善できていない」と思われる点を改善する方法について書こうと思います。
ではっ!
続き:
VisualStudioで実行した単体テストの結果の出力(2) 出力ファイルの読める化
VisualStudioで実行した単体テストの結果の出力(3) テスト実行からレポート生成までをツールで自動化
ディスカッション
コメント一覧
まだ、コメントがありません