單元測試
跨平臺應用程式應該經過測試,因為它們會在真實世界中用來改善其品質、可靠性和效能。 許多類型的測試皆應在應用程式上執行,包括單元測試、整合測試和使用者介面測試。 單元測試是最常見的形式,對於建置高品質的應用程序至關重要。
單元測試會採用應用程式的小型單元,通常是方法,將它與程式代碼的其餘部分隔離,並確認其行為如預期般。 其目標是檢查每個功能單位是否正常執行,使錯誤不至於傳播到整個應用程式。 偵測所發生的 Bug 比在次要失敗點間接觀察 Bug 的效果更有效率。
單元測試通常應該使用arrange-act-assert模式:
Step | 描述 |
---|---|
排列 | 初始化 物件,並設定傳遞給受測方法的數據值。 |
採取行動 | 使用必要的自變數叫用受測方法。 |
Assert | 確認受測方法的動作如預期般運作。 |
此模式可確保單元測試是可讀取、自我描述和一致的。
當單元測試是軟體開發工作流程不可或缺的一部分時,單元測試對程式代碼質量的影響最大。 單元測試可作為應用程式的設計檔和功能規格。 一旦方法撰寫完畢,就應該撰寫單元測試,以驗證回應標準、界限和不正確輸入資料案例的方法行為,並檢查程式碼所做的任何明確或隱含假設。 或者,在測試驅動開發中,也可以在程式碼之前撰寫單元測試。
重要
單元測試可有效解決迴歸。 也就是說,功能在過去運作正常,但卻因錯誤更新而受到干擾。
xUnit 是 .NET MAUI 應用程式的建議測試架構。
將 xUnit 測試新增至 .NET MAUI 解決方案
若要將 xUnit 測試新增至 .NET MAUI 解決方案,請執行下列其中一項:
使用 Visual Studio 將新的 xUnit 測試專案 新增至您的方案。
OR
使用 .NET CLI 建立新的 xUnit 測試專案,並將其新增至您的解決方案。 如需詳細資訊,請參閱 使用 dotnet test 和 xUnit 在 .NET 中對 C# 進行單元測試。
xUnit 測試項目的項目檔 (.csproj) 將類似下列範例:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
</Project>
$(TargetFramework)
build 屬性會指定測試專案的目標架構。 這會是計算機上安裝的最新版本 .NET。
套件 xunit
會引進包含測試架構本身的子套件,以及偵測單元測試常見問題的 Roslyn 分析器。 和 xunit.runner.visualstudio
Microsoft.NET.Test.Sdk
套件必須在 Visual Studio 中以及命令 dotnet test
中執行單元測試。 套件 coverlet.collector
允許收集程式代碼涵蓋範圍。 如果您不想要收集程式代碼涵蓋範圍,您可以移除此套件參考。 如需單元測試之程式代碼涵蓋範圍的詳細資訊,請參閱 使用程式碼涵蓋範圍進行單元測試。
建構應用程式以進行單元測試的主要方法有兩種:
- 您將進行單元測試的程式代碼位於 .NET MAUI 類別庫專案中。
- 您將進行單元測試的程式代碼位於 .NET MAUI 應用程式專案中。
每個方法都需要特定的設定。
設定用於單元測試的 .NET MAUI 類別庫專案
使用此方法時,您想要進行單元測試的程式代碼位於 .NET MAUI 類別庫專案中,而 .NET MAUI 應用程式專案會取用。 若要針對 .NET MAUI 類別庫撰寫單元測試,您必須更新專案所使用的目標架構。 這可以藉由將 xUnit 測試項目檔 (.csproj) 的 $(TargetFramework)
build 屬性的值新增至 $(TargetFrameworks)
.NET MAUI 類別庫專案檔中的組建屬性來達成:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
在此範例中,已將的值 net8.0
新增至 $(TargetFrameworks)
.NET MAUI 類別庫項目檔中的 build 屬性。
然後,您必須從 xUnit 測試專案新增 .NET MAUI 類別庫項目的參考。
設定用於單元測試的 .NET MAUI 應用程式專案
使用此方法時,您想要進行單元測試的程式代碼位於 .NET MAUI 應用程式專案中。 若要針對 .NET MAUI 應用程式專案撰寫單元測試,您必須更新專案所使用的目標架構。 這可以藉由將 xUnit 測試項目檔 (.csproj) 的$(TargetFramework)
組建屬性的值新增至 $(TargetFrameworks)
.NET MAUI 應用程式專案檔中的組建屬性來達成:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
在此範例中,已將的值 net8.0
新增至 $(TargetFrameworks)
.NET MAUI 應用程式項目檔中的組建屬性。
您也必須修改 .NET MAUI 應用程式專案,使其不會輸出 xUnit 測試專案所使用之目標架構的可執行檔。 將條件新增至 $(OutputType)
.NET MAUI 應用程式項目檔中的組建屬性,即可達成此目的:
<OutputType Condition="'$(TargetFramework)' != 'net8.0'">Exe</OutputType>
在此範例中,.NET MAUI 應用程式專案只有在目標架構不是 net8.0
時才會產生可執行檔。
然後,您必須從 xUnit 測試專案新增 .NET MAUI 應用程式項目的參考。
撰寫單元測試
xUnit 支援兩種不同類型的單元測試:
測試類型 | 屬性 | 描述 |
---|---|---|
事實 | Fact |
一律為 true 的測試,其會測試非變異的條件。 |
理論 | Theory |
僅特定資料集才為 true 的測試。 |
單元測試應該放在 xUnit 測試專案中,並以 或 [Theory]
屬性裝飾[Fact]
。 下列範例顯示使用 屬性的 [Fact]
單元測試:
namespace MyUnitTests
{
public class MyTests
{
[Fact]
public void PassingTest()
{
Assert.AreEqual(4, 2+2);
}
[Fact]
public void FailingTest()
{
Assert.AreEqual(5, 2+2);
}
}
}
在此範例中,測試代表故意通過和失敗的測試。
下列範例顯示使用 屬性的 [Theory]
單元測試:
namespace MyUnitTests
{
public class MyTests
{
[Theory]
[InlineData(3)]
[InlineData(4)]
[InlineData(5)]
public void MyTheoryTest(int value)
{
Assert.True(value % 2 == 1);
}
}
}
在此範例中,即使只有一個測試方法,但實際上有三個測試,因為理論會針對每個數據項執行一次。
提示
使用每個單元測試來測試一項作業。 測試的複雜度擴大,會使該測試的驗證更加困難。 藉由將單元測試限制為單一考慮,您可以確保測試可重複、隔離且運行時間較短。 如需詳細資訊,請參閱 單元測試最佳做法。
執行單元測試
單元測試可以在 Visual Studio 中的 [測試總管] 中執行,或使用 命令來執行 dotnet test
。 如需測試總管的相關信息,請參閱 使用測試總管執行單元測試。 如需命令的相關信息 dotnet test
,請參閱 使用 dotnet test 和 xUnit 和 dotnet test 在 .NET 中對 C# 進行單元測試。
使用裝置執行器執行單元測試
單元測試也可以使用裝置執行器在裝置上執行。 裝置執行器是測試執行器應用程式,可提供可視化執行器殼層,以及使用 XHarness 從 CLI 執行的一些攔截。 如需詳細資訊,請參閱測試裝置執行器Wiki的檔。