---
# System prepended metadata

title: TDD for  Bowling Game
tags: [TDD, ' C#', ' NUnit']

---

---
tags: TDD, NUnit, C#
---
# TDD for  Bowling Game



## 小試身手
* [[UnitTest] NUnit 入門教學](https://marcus116.blogspot.com/2019/01/unittest-nunit.html)
* [[UnitTest] Visual Studio 2017 新增單元測試時沒有 NUnit 選項 ?](https://marcus116.blogspot.com/2019/01/create-unit-test-missing-nunit-in-visualstudio2017.html)

## 參考資料

* [30天快速上手TDD 系列](https://ithelp.ithome.com.tw/users/20010292/ironman/462)
* [The Three Laws of TDD](https://tdd.best/blog/the-three-laws-of-tdd/)
* [測試第1篇: 快速入門 MSTest V.S. NUnit(C#)](https://hiskio.com/courses/235/about)
* [m@rcus 學習筆記](https://marcus116.blogspot.com/search/label/Nunit)
* [NUnit - 測試案例生命週期 Life Cycle](https://blog.johnwu.cc/article/nunit-life-cycle.html)

## 保齡球的 Test Case


| Test Case | Act            | Assert   |
| --------- | -------------- | -------- |
| #1        | 建立 Game 物件  | (1) 總分 |
| #2        | 投擲1次               |(1) 總分          |
| #3        | 投擲2次，但是沒有 spare 與 strike               |(1) 總分<br>(2) 當前的 frame 的分<br>|
| #4        |投擲4次，但是沒有 spare 與 strike|(1) 總分<br>(2) 每一輪(frame)的分數
| #5        |投擲3次的，但第1局是 spare                |(1) 第1局的分數|
| #6        |投擲4次的，但第1局是 spare                |(1) 第1局的分數<br>(2) 第2局的分數<br> (3) 總分  |
| #7        |投擲3次的，但第1局是 strike                |(1) 1'st frame 的分數<br>(2) 總分|
| #8        |從頭到尾都是 strike                |(1) 總分<br>(2) 當前的 frame|
| #9        |1~9 局都是零分，但第10局是1次 spare 與 1次 strike|(1) 總分           |
| #10       |前面連續 11次 strike ，但最後1次是9分                |(1) 總分           |
| #11       |前面連續9次 strike ，第10局是 spare                |(1) 總分           |
| #12       |模擬一場比賽                |(1) 總分           |

## Test Case 的 Sample Code
Test Case #1
```gherkin=
// TC#1：建立 Game 物件
// 關注：(1) 總分
[Test]
public void Test_NewGame_ReturnZero()
{
    //arrange
    Game game = new Game();

    //act

    //assert
    Assert.AreEqual(0, game.Score);
}
```
Test Case 2
```gherkin=
// TC#2：投擲1次
// 關注：(1) 總分
[Test]
public void TestOneThrow()
{
    //arrange
    Game game = new Game();
    //act
    game.Add(5);

    //assert
    Assert.AreEqual(5, game.Score);
}
```
Test Case #3
```gherkin=
// TC#3：投擲2次，但是沒有 spare 與 strike
// 關注：(1) 總分
[Test]
public void TestTwoThrowsNoMark()
{
    //arrange
    Game game = new Game();
    //act
    game.Add(5);
    game.Add(4);
    //assert
    Assert.AreEqual(9, game.Score);
}
```
Test Case #4
```gherkin=
// TC#4：投擲4次，但是沒有 spare 與 strike
// 關注：(1) 總分
//       (2) 每一輪(frame)的分數

[Test]
public void TestFourThrowsNoMark()
{
    //arrange

    //act
    game.Add(5);
    game.Add(4);
    game.Add(7);
    game.Add(2);

    //assert
    Assert.AreEqual(18, game.Score);
    Assert.AreEqual(9, game.ScoreForFrame(1));
    Assert.AreEqual(18, game.ScoreForFrame(2));
}
```
Test Case #5
```gherkin=
// TC#5：投擲3次的，但第1局是 spare
// 關注：(1) 第1局的分數
[Test]
public void TestSimpleSpare()
{
    //arrange

    //act
    game.Add(3);
    game.Add(7);
    game.Add(3);

    //assert
    Assert.AreEqual(13, game.ScoreForFrame(1));
}
```
Test Case #6
```gherkin=
// TC#6：投擲4次的，但第1局是 spare
// 關注：(1) 第1局的分數
//       (2) 第2局的分數
//       (3) 總分
[Test]
public void TestSimpleFrameAfterSpare() 
{
    //arrange

    //act
    game.Add(3);
    game.Add(7);
    game.Add(3);
    game.Add(2);
    //assert
    Assert.AreEqual(13, game.ScoreForFrame(1));
    Assert.AreEqual(18, game.ScoreForFrame(2));
    Assert.AreEqual(18, game.Score);
}
```
Test Case #7
```gherkin=
// TC#7：投擲3次的，但第1局是 strike
// 關注：(1) 第1局的分數
//       (2) 總分
[Test]
public void TestSimpleStrike()
{
    //arrange

    //act
    game.Add(10);
    game.Add(3);
    game.Add(6);

    //assert
    Assert.AreEqual(19, game.ScoreForFrame(1));
    Assert.AreEqual(28, game.Score);
}
```
Test Case #8
```gherkin=
// TC#8：從頭到尾都是 strike
// 關注：(1) 總分
[Test]
public void TestPerfectGame()
{
    //arrange

    //act
    for (int i = 0; i < 12; i++)
    {
        game.Add(10);
    }

    //assert
    Assert.AreEqual(300, game.Score);
}
```
Test Case #9
```gherkin=
// TC#9：1~9 局都是零分，但第10局是1次 spare 與 1次 strike
// 關注：(1) 總分
[Test]
public void TestEndOfArray()
{
//arrange

//act
for (int i = 0; i < 9; i++)
    {
        game.Add(0);
        game.Add(0);
    }
    game.Add(2);
    game.Add(8);
    game.Add(10);

     //assert
Assert.AreEqual(20, game.Score);
}
```
Test Case #10
```gherkin=
// TC#10：前面連續 11次 strike ，但最後1次是9分
// 關注：(1) 總分
[Test]
public void TestHeartBreak()
{
//arrange

//act
    for (int i = 0; i < 11; i++)
        game.Add(10);
    game.Add(9);

//assert
    Assert.AreEqual(299, game.Score);
}
```
Test Case #11
```gherkin=
// TC#11：前面連續9次 strike ，第10局是 spare
// 關注：總分
[Test]
public void TestTenthFrameSpare()
{
    //arrange

//act
    for (int i = 0; i < 9; i++)
        game.Add(10);
    game.Add(9);
    game.Add(1);
    game.Add(1);
     //assert
Assert.AreEqual(270, game.Score);
}
```
Test Case #12
```gherkin=
// TC#12：模擬一場比賽
// 關注：總分
[Test]
public void TestSampleGame()
{
    game.Add(1);
    game.Add(4);

    game.Add(4);
    game.Add(5);

    game.Add(6);
    game.Add(4);

    game.Add(5);
    game.Add(5);

    game.Add(10);

    game.Add(0);
    game.Add(1);

    game.Add(7);
    game.Add(3);

    game.Add(6);
    game.Add(4);

    game.Add(10);

    game.Add(2);
    game.Add(8);

    game.Add(6);

    //assert
    Assert.AreEqual(133, game.Score);
}
```