VisualStudioで実行した単体テストの結果の出力(1)
ファイルへの出力

2021年2月27日

どもです。

最近、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では、優秀なテストツール/フレームワークが使用可能です。
機能追加やバグの修正に伴うリグレッションテストも、ボタン一つで実行可能です。
テスト結果も、一目で確認ができます。
test_result_of_vs_001
また、カバレッジ測定についても別途ツールを適用することで過去のエントリの通り確認ができます。
非常に素晴らしいです。

しかしこの環境でも、「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) テスト実行からレポート生成までをツールで自動化