単体テストと副作用 - 第1話 はじまり

# 本シリーズ

**単体テストと副作用 - 第1話 はじまり**
[単体テストと副作用 - 第2話 オブジェクト指向](https://qiita.com/hiki_neet_p/items/dd101438ba2c57d49c78)
[単体テストと副作用 - 第3話 DIとモック](https://qiita.com/hiki_neet_p/items/826b3797475451d9f8c9)
[単体テストと副作用 - 第4話 副作用の回避](https://qiita.com/hiki_neet_p/items/d933a89165a9cc437816)
[単体テストと副作用 - 第5話 オブジェクト指向への反乱](https://qiita.com/hiki_neet_p/items/dfe02f254bd8d67a5f62)

# はじめに

私は単体テストをしてみたい(・ω・)！
でも、やり方分かんないお。
ググってみる…。
うーむ。
検索してもそれっぽい記事があんまり見つからないお(´・ω・｀)
おかしくない？
プログラマは単体テストと常に共にあると思っていたのに…。
その具体的な方法について書かれた記事が少ない気がする。
何も考えないでコードを書くと、とてもじゃないけどテストなんてできないようなゴミコードが出来あがる…。
それは即ち、単体テスト可能なコードというのは、キチンと考えられ、整然と法則に従っているコードだということ。
そのやり方を、誰かに指南してほしかったのに…。

…(´・ω・｀)

仕方ない、自分でやり方考えるお。

# お題降臨

さて、何から始めればいいのやら…(・ω・)

『…きこえますか…今…あなたの心に…直接呼びかけています…副作用です…副作用を意識するのです』

むむ、テストの女神が私に語りかける…(・ω・)！

『…私がお題を授けましょう…あなたはこの仕様を満たすプログラムを書くのです…

- カンマ区切りの文字列を、標準入力から受け取りなさい…。
- 受け取った文字列をカンマで分割し、各値のデータ型を調べなさい…。
  - 空白または `null` のデータ型は `null` です…。
  - `true` または `false` のデータ型は `bool` です…。
  - 数値のデータ型は `number` です…。
  - それ以外の値のデータ型は `string` です…。
- 各値を `値 : データ型` という形式で、標準出力に1秒間隔で表示しなさい…。

…分かったら早々に書くのです…最後の審判…締め切りの日は近い…』

ほほーう。
なんかエラそうだけど簡単だお。
10分もかかんないお(・ω・)

# 最初のプログラム

…こんな感じかな。

[GitHubリンク](https://github.com/tana-gh/TestableSample1)

```csharp:TestableSample1/TestableSample1.App/Program.cs
using System;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace TestableSample1.App
{
    internal class Program
    {
        private static async Task Main(string[] args)
        {
            Console.Write("カンマ区切りの値を入力：");
            var valueStrs = Console.ReadLine();

            var splittedStrs = valueStrs.Split(",", StringSplitOptions.None);

            foreach (var str in splittedStrs)
            {
                await Task.Delay(1000);

                if (Regex.IsMatch(str, @"^(|null)$"))
                {
                    Console.WriteLine($"{str} : null");
                }
                else if (Regex.IsMatch(str, @"^(true|false)$"))
                {
                    Console.WriteLine($"{str} : bool");
                }
                else if (Regex.IsMatch(str, @"^-?[0-9]+(\.[0-9]+)?$"))
                {
                    Console.WriteLine($"{str} : number");
                }
                else
                {
                    Console.WriteLine($"{str} : string");
                }
            }
        }
    }
}
```

```text
カンマ区切りの値を入力：x,,null,true,false,1,-23.45,abcde
x : string
 : null
null : null
true : bool
false : bool
1 : number
-23.45 : number
abcde : string
```

(＾ω＾)

ちゃんと1秒ごとに表示できたお。
完璧だお。

『…きこえますか…今…あなたのミジンコ並みの脳味噌に…直接呼びかけています…』

口汚い女神だお(´・ω・｀)

『…テストです…テストコードを書くのです…』

# テストができない

テストのことをすっかり忘れていたお。
ふーむ…。
`Main` メソッドに全部ベタ書きだから、テストコードなんて書きようがないよ(・ω・)
プログラムを起動して、標準入力に文字列を打ち込むしかできない。
こんなミジンコ並みのコードでは、単体テストへの道も開けないよね。

…(´・ω・｀)

試しに、オブジェクト指向っぽく書いてみようかな。

～ 次回へ続く ～

# ここまでのまとめ

- 副作用を意識する…？
- `Main` 関数にベタ書きでは、テストコードが（普通は）全く書けない。

# 本シリーズ

**単体テストと副作用 - 第1話 はじまり**
[単体テストと副作用 - 第2話 オブジェクト指向](https://qiita.com/hiki_neet_p/items/dd101438ba2c57d49c78)
[単体テストと副作用 - 第3話 DIとモック](https://qiita.com/hiki_neet_p/items/826b3797475451d9f8c9)
[単体テストと副作用 - 第4話 副作用の回避](https://qiita.com/hiki_neet_p/items/d933a89165a9cc437816)
[単体テストと副作用 - 第5話 オブジェクト指向への反乱](https://qiita.com/hiki_neet_p/items/dfe02f254bd8d67a5f62)