各工程毎に品質を確認してから後工程に進んでいく事は、アプリの品質とその後の保守性を高めるうえで欠かせない開発手法です。
本ブログでは、Visual Studio 2022 を使って、ユニットテストから完成までに通るテストの流れを、サンプルコードと開発フローを交えて紹介します。
テストの全体像
まずは、アプリが完成するまでに通過すべきテスト段階を整理してみます。

ユニットテスト(Unit Test)
最小単位の機能(クラス・メソッド)をテストします。例えば、計算ロジックやバリデーションロジックなどが対象です。
■主なテストツール
- xUnit
- .NET で広く使われているフレームワーク。「テスト駆動開発(TDD)」 を強力にサポート
- テスト エクスプローラーと標準で連携し、テストを実行・管理できる
- MSTest
- Microsoft 純正のテストフレームワーク。
- テスト エクスプローラーと標準で連携しテストを実行・管理できる
- NUnit
- 柔軟なアサーションと豊富な属性が特徴。
- Visual Studio 拡張機能でテストを実行・管理できる
「xUnit」と「MSTest」によるユニットテストは、下記ブログで紹介しています。
- 「xUnit」 :C# アプリ 「xUnit」によるユニットテスト!
- 「MSTest」:C# アプリ「MSTest V2」によるユニットテスト!
サンプル:MSTest による加算クラスのテスト
本ユニットテストの実行は、メニューから「テスト」→「全てのテストを実行」で行います。
本体側の「 Assert.AreEqual(5, result);」でテスト結果を判定します。
本体側(Calculator.cs):
namespace MyApp.Logic
{
public class Calculator
{
public int Add(int a, int b) => a + b;
}
}
テスト側(CalculatorTests.cs):
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyApp.Logic;
namespace MyApp.Tests
{
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void Add_ValidNumbers_ReturnsSum()
{
var calc = new Calculator();
var result = calc.Add(2, 3);
Assert.AreEqual(5, result);
}
}
}

結合テスト(Integration Test)
ユニットテストではカバーできない「複数コンポーネント間の連携」が対象です。
■主なテストツール
- xUnit.net, MSTest, NUnit
- 単体テストと同様に使用できるが、外部リソース(データベース、APIなど)との結合をテスト対象にするケースが多い
- TestHost (ASP.NET Core)
- Web API などのテストに最適
- HTTP リクエストを直接送信し、レスポンスを検証できる
サンプル:UIボタン → ロジック呼び出し → データ保存
- UI(Form)
- ロジック(Serviceクラス)
- ファイルやDB
テストツールは使用していませんが、下記の様なテストを実施します。
UserService.SaveUser
が、内部でファイル保存や DB 書き込みを行う場合、この一連の動作が結合テストの対象になります。
// Button Click イベントで呼ばれる
private void btnSave_Click(object sender, EventArgs e)
{
var service = new UserService();
service.SaveUser(txtName.Text, txtEmail.Text);
}
テストポイント
- 空白の入力で保存されないか?
- データ保存後、UIが正しくリセットされるか?
- DB に正しくデータが書き込まれているか?

UI テスト(UI Test)/ E2E テスト
UIテストの自動化
UI 操作を自動化して、ボタンクリックや入力などの動作が仕様通りかをチェックします。
■主な自動化ツール
- WinAppDriver(Microsoft公式)
- Windows 10 以降で動作し、ネイティブアプリや UWP アプリを操作できる
- C#, Python, JavaScript, Java などの言語で利用可能
- Appium
- モバイルでの自動テストも可能
- Android、iOS、Windows アプリケーションに対応
- C#, Python, JavaScript, Java などの言語で利用可能
- TestStack.White(古いが簡単)
- C# などの .NET 言語から直接利用でき、Visual Studio と相性が良い
- ボタン、テキスト入力、ウィンドウ操作などを容易に自動化できる
■TestStack.White を使用した自動化の例
// 擬似コード例:ボタンクリック後に結果が表示されるか
app.Launch("MyApp.exe");
app.GetWindow("MainForm").Get<Button>("btnSave").Click();
Assert.IsTrue(app.GetWindow("MainForm").Get<Label>("lblStatus").Text == "保存完了");
E2E テスト
システム全体のフローを一貫してテストする手法
■主なツール
- Selenium
- ブラウザ操作を自動化するためのオープンソースツール
- Playwright
- Microsoft 製のE2Eテストツール。クロスブラウザ対応で、Visual Studio で利用しやすい
- Cypress
- JavaScript ベースのフロントエンドE2Eテストツール
- JavaScript ベースのフロントエンドE2Eテストツール

システムテスト(System Test)
アプリ全体としてのシナリオテストを実施します。主に QA 担当者や開発者が実機で動作確認を行います。
テスト例
- ログイン → 登録 → 検索 → 更新 → 削除 の一連の流れ
- データが正しく永続化されるか
- 想定外の操作をしても落ちないか
受け入れテスト(Acceptance Test)
ユーザーや発注者が「仕様どおりに動くか?」を確認します。
- 画面UIは設計通りか?
- 操作性に問題はないか?
- 実務に使える精度や速度か?
この段階で 「OK」=完成(リリース可能) です。
自動テストを開発フローに組み込むと強い
単体テストや結合テストを Git と連携し、CI(継続的インテグレーション)ツールで自動実行することで、テスト漏れ・品質劣化を防げます。
CIとは、開発者が書いたコードを頻繁に統合(マージ)するプロセスのことです。
- 目的:コードの結合に伴う問題を早期発見し、品質を向上させる
- 主な手順
- コードコミット
GitHubやGitLabなどのリポジトリにプッシュ - 自動ビルド
コミットを検知して、自動ビルドを実施。 - 自動テスト
ユニットテストや統合テストを自動で実行。 - レポート生成
ビルドやテストの結果をフィードバック。
- コードコミット
推奨構成
GitHub + GitHub Actions での dotnet test
実行
- リポジトリ作成
- ソースコードやプロジェクトのファイルを管理する場所を作成する
- GitHub Actions 設定
- リポジトリに対して、コードのビルド、テスト、自動デプロイなどを自動化
- ファイルの変更をコミット(保存)GitHubしてプッシュ
- GitHub Actionsがトリガーされ、自動でビルドとテストが行われます
- 実行結果確認
- GitHubリポジトリのActionsタブからワークフローの実行結果を確認

まとめ
特に以下のポイントを押さえておくと開発効率も品質も向上します。
- 最初からユニットテストを用意する
- 結合やUIの自動テストも並行して構築
- 手動テストを自動化に切り替えていく
テストは「面倒な作業」ではなく、「将来の自分やチームを守る仕組み」です。