nunit-skill について
nunit-skillは、C#開発者向けのNUnit 3テストリファレンススキルです。テスト構成、アサーション、ライフサイクルを扱い、発展的な実践ガイドも案内します。
主な機能
- 01NUnit 3のテストフィクスチャとライフサイクル
- 02制約モデルによるアサーション
- 03パラメーター化テスト
- 04Moqのモック例
- 05カテゴリ、無視、タイムアウト属性
- 06セットアップとテスト実行コマンド
活用シーン
- 01NUnitの制約モデルでアサーションを記述
- 02パラメーター化テストの構成
- 03テスト単位とフィクスチャ単位のセットアップ管理
- 04カテゴリでテスト実行を絞り込み
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill nunit-skillインストール後、Claude Code で/nunit-skillを入力して読み込まれたか確認します。
同梱ファイルreference/advanced-patterns.mdreference/playbook.md
詳細
NUnit 3 テストスキル
基本パターン
基本的なテスト
using NUnit.Framework;
[TestFixture]
public class CalculatorTests
{
private Calculator _calculator;
[SetUp]
public void SetUp() => _calculator = new Calculator();
[Test]
public void Add_TwoPositiveNumbers_ReturnsSum()
{
Assert.That(_calculator.Add(2, 3), Is.EqualTo(5));
}
[Test]
public void Divide_ByZero_ThrowsException()
{
Assert.Throws<DivideByZeroException>(() => _calculator.Divide(10, 0));
}
[TearDown]
public void TearDown() { /* cleanup */ }
}
制約モデル(Assert.That)
Assert.That(actual, Is.EqualTo(expected));
Assert.That(actual, Is.Not.EqualTo(unexpected));
Assert.That(value, Is.GreaterThan(5));
Assert.That(value, Is.InRange(1, 10));
Assert.That(str, Does.Contain("hello"));
Assert.That(str, Does.StartWith("He").IgnoreCase);
Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection, Has.Member("item"));
Assert.That(collection, Is.All.GreaterThan(0));
Assert.That(obj, Is.Null);
Assert.That(obj, Is.Not.Null);
Assert.That(obj, Is.InstanceOf<MyClass>());
Assert.That(actual, Is.EqualTo(3.14).Within(0.01));
Assert.That(() => Method(), Throws.TypeOf<ArgumentException>()
.With.Message.Contains("invalid"));
パラメーター化テスト
[TestCase(2, 3, 5)]
[TestCase(-1, 1, 0)]
[TestCase(0, 0, 0)]
public void Add_ReturnsCorrectSum(int a, int b, int expected)
{
Assert.That(_calculator.Add(a, b), Is.EqualTo(expected));
}
[TestCaseSource(nameof(DivisionCases))]
public void Divide_ReturnsCorrectQuotient(int a, int b, double expected)
{
Assert.That(_calculator.Divide(a, b), Is.EqualTo(expected).Within(0.01));
}
private static IEnumerable<TestCaseData> DivisionCases()
{
yield return new TestCaseData(10, 2, 5.0).SetName("10/2=5");
yield return new TestCaseData(7, 3, 2.33).SetName("7/3=2.33");
}
Moq によるモック
using Moq;
[TestFixture]
public class UserServiceTests
{
private Mock<IUserRepository> _mockRepo;
private Mock<IEmailService> _mockEmail;
private UserService _service;
[SetUp]
public void SetUp()
{
_mockRepo = new Mock<IUserRepository>();
_mockEmail = new Mock<IEmailService>();
_service = new UserService(_mockRepo.Object, _mockEmail.Object);
}
[Test]
public void CreateUser_SavesAndSendsEmail()
{
_mockRepo.Setup(r => r.Save(It.IsAny<User>())).Returns(new User { Id = 1 });
var result = _service.CreateUser("[email protected]", "Alice");
Assert.That(result.Id, Is.EqualTo(1));
_mockRepo.Verify(r => r.Save(It.IsAny<User>()), Times.Once);
_mockEmail.Verify(e => e.SendWelcome("[email protected]"), Times.Once);
}
}
ライフサイクル
[OneTimeSetUp] → Before all tests in fixture
[SetUp] → Before each test
[Test] → Test method
[TearDown] → After each test
[OneTimeTearDown] → After all tests in fixture
カテゴリーと属性
[Test, Category("Smoke")]
public void QuickTest() { }
[Test, Ignore("Bug #123")]
public void SkippedTest() { }
[Test, Timeout(5000)]
public void TimeLimitedTest() { }
[Test, Retry(3)]
public void FlakyTest() { }
アンチパターン
| 悪い例 | 良い例 | 理由 |
|---|---|---|
Assert.AreEqual(a, b)(クラシック) | Assert.That(a, Is.EqualTo(b)) | 制約モデルの方が多機能です |
[SetUp] がない | 適切なライフサイクル | リソース管理 |
| プライベートメソッドのテスト | パブリック API のテスト | カプセル化 |
| カテゴリーがない | [Category("Smoke")] | サブセットを実行できます |
セットアップ:dotnet add package NUnit NUnit3TestAdapter Microsoft.NET.Test.Sdk
実行:dotnet test または dotnet test --filter TestCategory=Smoke
応用パターン
応用パターン、デバッグガイド、CI/CD 統合、ベストプラクティスについては、
reference/playbook.md を参照してください。
コメント
Markdown 対応