20
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-06

本シリーズ

単体テストと副作用 - 第1話 はじまり
単体テストと副作用 - 第2話 オブジェクト指向
単体テストと副作用 - 第3話 DIとモック
単体テストと副作用 - 第4話 副作用の回避
単体テストと副作用 - 第5話 オブジェクト指向への反乱

はじめに

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

…(´・ω・`)

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

お題降臨

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

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

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

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

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

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

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

最初のプログラム

…こんな感じかな。

GitHubリンク

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");
                }
            }
        }
    }
}
カンマ区切りの値を入力: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話 オブジェクト指向への反乱

20
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?