本シリーズ
単体テストと副作用 - 第1話 はじまり
単体テストと副作用 - 第2話 オブジェクト指向
単体テストと副作用 - 第3話 DIとモック
単体テストと副作用 - 第4話 副作用の回避
単体テストと副作用 - 第5話 オブジェクト指向への反乱
はじめに
私は単体テストをしてみたい(・ω・)!
でも、やり方分かんないお。
ググってみる…。
うーむ。
検索してもそれっぽい記事があんまり見つからないお(´・ω・`)
おかしくない?
プログラマは単体テストと常に共にあると思っていたのに…。
その具体的な方法について書かれた記事が少ない気がする。
何も考えないでコードを書くと、とてもじゃないけどテストなんてできないようなゴミコードが出来あがる…。
それは即ち、単体テスト可能なコードというのは、キチンと考えられ、整然と法則に従っているコードだということ。
そのやり方を、誰かに指南してほしかったのに…。
…(´・ω・`)
仕方ない、自分でやり方考えるお。
お題降臨
さて、何から始めればいいのやら…(・ω・)
『…きこえますか…今…あなたの心に…直接呼びかけています…副作用です…副作用を意識するのです』
むむ、テストの女神が私に語りかける…(・ω・)!
『…私がお題を授けましょう…あなたはこの仕様を満たすプログラムを書くのです…
- カンマ区切りの文字列を、標準入力から受け取りなさい…。
- 受け取った文字列をカンマで分割し、各値のデータ型を調べなさい…。
- 空白または
null
のデータ型はnull
です…。 -
true
またはfalse
のデータ型はbool
です…。 - 数値のデータ型は
number
です…。 - それ以外の値のデータ型は
string
です…。
- 空白または
- 各値を
値 : データ型
という形式で、標準出力に1秒間隔で表示しなさい…。
…分かったら早々に書くのです…最後の審判…締め切りの日は近い…』
ほほーう。
なんかエラそうだけど簡単だお。
10分もかかんないお(・ω・)
最初のプログラム
…こんな感じかな。
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");
}
}
}
}
}
カンマ区切りの値を入力: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話 オブジェクト指向
単体テストと副作用 - 第3話 DIとモック
単体テストと副作用 - 第4話 副作用の回避
単体テストと副作用 - 第5話 オブジェクト指向への反乱