このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。 事前に構築されたソリューションを使ってチュートリアルを進めたい場合は、開始する前にサンプルコードを表示またはダウンロードしてください。 ダウンロード手順については、サンプルとチュートリアルを参照してください。
この記事では、.NET Core プロジェクトのテストについて説明します。 もし ASP.NET Core プロジェクトをテストする場合は、ASP.NET Core の統合テストを参照してください。
ソース プロジェクトの作成
シェル ウィンドウを開きます。 ソリューションを保持する unit-testing-vb-mstest という名前のディレクトリを作成します。
この新しいディレクトリ内で、 dotnet new sln
を実行して新しいソリューションを作成します。 この方法により、クラス ライブラリと単体テスト プロジェクトの両方を簡単に管理できます。
ソリューション ディレクトリ内に 、PrimeService ディレクトリを作成します。 ここまでは、次のディレクトリとファイル構造があります。
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
PrimeService を現在のディレクトリにし、dotnet new classlib -lang VB
実行してソース プロジェクトを作成します。
Class1.VBの名前をPrimeService.VBに変更します。
PrimeService
クラスの失敗した実装を作成します。
Namespace Prime.Services
Public Class PrimeService
Public Function IsPrime(candidate As Integer) As Boolean
Throw New NotImplementedException("Please create a test first")
End Function
End Class
End Namespace
ディレクトリを unit-testing-vb-using-mstest ディレクトリに戻します。
dotnet sln add .\PrimeService\PrimeService.vbproj
を実行して、クラス ライブラリ プロジェクトをソリューションに追加します。
テスト プロジェクトの作成
次に、 PrimeService.Tests ディレクトリを作成します。 次のアウトラインは、ディレクトリ構造を示しています。
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
PrimeService.Tests ディレクトリを現在のディレクトリにし、dotnet new mstest -lang VB
を使用して新しいプロジェクトを作成します。 このコマンドは、MSTest をテスト ライブラリとして使用するテスト プロジェクトを作成します。 生成されたテンプレートは、 PrimeServiceTests.vbproj でテスト ランナーを構成します。
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>
テスト プロジェクトでは、単体テストを作成して実行するために他のパッケージが必要です。
dotnet new
前の手順で MSTest を追加しました。 次に、 PrimeService
クラス ライブラリを別の依存関係としてプロジェクトに追加します。
dotnet reference add
コマンドを使用します。
dotnet reference add ../PrimeService/PrimeService.vbproj
ファイル全体は GitHub の サンプル リポジトリ で確認できます。
最終的なソリューション レイアウトは次のとおりです。
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.vbproj
dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
ディレクトリでを実行します。
最初のテストの作成
失敗したテストを 1 つ記述し、合格させ、プロセスを繰り返します。 PrimeService.Tests ディレクトリからUnitTest1.vbを削除し、PrimeService_IsPrimeShould.VBという名前の新しい Visual Basic ファイルを作成します。 次のコードを追加します。
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Namespace PrimeService.Tests
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.IsFalse(result, "1 should not be prime")
End Sub
End Class
End Namespace
<TestClass>
属性は、テストを含むクラスを示します。
<TestMethod>
属性は、テスト ランナーによって実行されるメソッドを表します。
unit-testing-vb-mstest から、dotnet test
を実行してテストとクラス ライブラリをビルドし、テストを実行します。 MSTest テスト ランナーには、テストを実行するためのプログラム エントリ ポイントが含まれています。
dotnet test
を実行すると、作成した単体テスト プロジェクトを使用してテスト ランナーが開始されます。
テストが失敗します。 実装はまだ作成していません。 動作する PrimeService
クラスで最も単純なコードを記述して、このテストを成功させる。
Public Function IsPrime(candidate As Integer) As Boolean
If candidate = 1 Then
Return False
End If
Throw New NotImplementedException("Please create a test first.")
End Function
unit-testing-vb-mstest ディレクトリで、dotnet test
をもう一度実行します。
dotnet test
コマンドは、PrimeService
プロジェクトのビルドを実行してから、PrimeService.Tests
プロジェクトに対してビルドを実行します。 両方のプロジェクトをビルドした後、この 1 つのテストを実行します。 成功します。
その他の機能の追加
テストが1つ成功したので、さらに多くのテストケースを書きましょう。 素数には、他にも 0、-1 という単純なケースがいくつかあります。 これらのケースは、 <TestMethod>
属性を持つ新しいテストとして追加できますが、それはすぐに面倒になります。 同様のテストのスイートを記述できる他の MSTest 属性があります。
<DataRow>
属性と<TestMethod>
属性を使用して、これらの入力の値を指定できます。
新しいテストを作成する代わりに、これら 2 つの属性を適用して単一の理論を作成します。 この理論は、2 未満の複数の値をテストする方法です。これは最も小さい素数です。
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
<DataRow(-1)>
<DataRow(0)>
<DataRow(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
<TestMethod>
<DataRow(2)>
<DataRow(3)>
<DataRow(5)>
<DataRow(7)>
Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsTrue(result, $"{value} should be prime")
End Sub
<TestMethod>
<DataRow(4)>
<DataRow(6)>
<DataRow(8)>
<DataRow(9)>
Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
End Class
dotnet test
を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストに合格するには、メソッドの先頭にある if
句を変更します。
if candidate < 2
メイン ライブラリにテストを追加し、理論を増やし、さらに多くのコードを追加して、反復を続けます。 テストの完了バージョンとライブラリの完全な実装があります。
あなたは、小さなライブラリとそのライブラリの単体テストのセットを構築しました。 新しいパッケージとテストの追加が通常のワークフローの一部になるように、ソリューションを構築しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。
.NET