【CI】テスト自動化を取り組む前に知っておくべき事【持論】

>この記事では、《CIやテストの自動化》について、
僕が学習した内容をまとめています。

- __なぜテスト自動化が流行らないのか…?__
- __CIって何なの…？__
- __テストを自動化するメリット・デメリット__

こういった疑問についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

##【業務システム系】そもそも、なぜテスト自動化が流行らないのか…?

###背景：日本はウォーターフォール型が約７割を占める…？？

![waterfall-828948_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/50f7add5-0e6c-2529-1a61-0e6b3915a0d1.jpeg)

そもそも、日本は『ウォーターフォール』を採用している企業が全体の半数以上を占めているようです。（実際のところ分かりませんが、、、）

参考：[2019年度 アジャイルプロジェクトマネジメント意識調査報告書](https://www.pmi-japan.org/topics/PMI_Japan_Chapter_Agile_Survey_2019.pdf)

>__『ウォーターフォール』とは…？__

>『ウォーターフォール』とは、下記の６つの工程…<br>
>1. &ensp;__要件定義__
2. &ensp;__外部設計（基本設計）__
3. &ensp;__内部設計（詳細設計）__
4. &ensp;__開発（プログラミング）__
5. &ensp;__テスト__
6. &ensp;__運用__

>を、『1. 要件定義』〜『6. 運用』へ順次移行していく開発手法で、下流から上流へは戻らない水の流れに例えて『ウォーターフォール』と呼ばれています。

『ウォーターフォール』は、予めスケジュールが決められており、テストは開発が終わった後に持ってこられます。

そのため・・・

__テストは最後にまとめて行うので、テストを自動化するメリットは少なく、結果的にテスト自動化を採用する企業が少ない__という訳です。

余談ですが・・・

海外では、__『アジャイル開発』__が主流です。

>__『アジャイル開発』とは…？__

>『アジャイル（Agile）』とは、直訳すると「素早い」「機敏な」という意味で、その言葉の通り素早い開発ということです。

>具体的には、『ウォーターフォール』の下記の６つの工程…<br>
>1. &ensp;__要件定義__
2. &ensp;__外部設計（基本設計）__
3. &ensp;__内部設計（詳細設計）__
4. &ensp;__開発（プログラミング）__
5. &ensp;__テスト__
6. &ensp;__運用__

>を、各機能ごとに行います。例えば、機能が３つあるアプリを作成するとしたら、

>『ウォーターフォール』では、３つの機能を開発してからテスト・運用と移っていきますが、

>『アジャイル開発』では、１つ目の機能を開発→テスト→運用、２つ目の機能を開発→テスト→運用…と__小さくサイクルを回して行きます。__

上記のように、__開発の度に毎回手動でテストをするのは時間もコストもかかるので厳しい__です。

そのため・・・

『アジャイル開発』を多く採用している海外では、テスト自動化は当たり前に行っているようです。

##『CI』とは…？

![devops-3155972_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/5abf2cab-7b3a-77b8-7b50-385cb6f53d26.jpeg)

__『CI』__とは・・・

『Continuous Integration』の略で、日本語で__継続的インテグレーション__と呼ばれています。
（インテグレーション = 結合、統合）

『CI』についてざっくり言うと…

__別々に開発した機能（ソースコード）を持ち寄って、お互いの動作を確認する『結合テスト』を、コミットの度に行うこと__です。

###【余談】CIを支えるツールを少しご紹介
![tools_support_ci.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/1523471b-d0a8-4206-7b6a-e42b8b039faf.png)

####テストツール
バージョン管理システムからソースコードを取得して、テストを行う。

- [PHPUnit](https://phpunit.readthedocs.io/ja/latest/)
- [JUnit](https://junit.org/junit5/)

etc… 

####ビルドツール
バージョン管理システムからソースコードを取得して、ビルドする。

- [Maven](https://maven.apache.org/)
- [Gradle](https://gradle.org/)

etc… 

####VCS（バージョン管理システム）
ソースコードを管理する。

- [Git](https://git-scm.com/)
- [SVN](https://tortoisesvn.net/)

etc… 


####CIツール
他のツールを自動実行する。

- [Jenkins](https://jenkins.io/)
- [CircleCI](https://circleci.com/ja/)

etc… 

####バグ管理ツール
バグの報告を管理する。

- [Redmine](http://redmine.jp/)
- [Trac](https://trac.edgewall.org/)

etc… 

##『CI』を実践するメリット【２つ紹介】

![arrow-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/eae7d10a-7a83-be32-1cb3-4962cdc658bd.jpeg)

『CI』を実践するメリットは、例えば下記の２つがあります。

1. &ensp;__自動テストで早期にバグを発見できる__
2. &ensp;__チームの生産性と効率アップ__

それでは、ひとつずつ見ていきましょう。

###メリット①：自動テストで早期にバグを発見できる

1. &ensp;__A：共通部品を開発__
2. &ensp;__B：Aが開発した共通部品を利用して、別の部品を開発__
3. &ensp;__A：共通部品を修正__

例えば、上記の１~３の流れで作業し、Aが共通部品を修正した影響で、Bが開発した機能にバグが発生したとします。

しかし・・・

__結合テストを行うまで、そのバグを発見することができない可能性があり、バグの大きさによっては納期に影響を及ぼすような可能性もあります。__

反対に、CIを実践した場合はというと・・・

__コミットの度に自動ビルドとテストが実施されるため、問題の発見にかかる時間が最小になり、すぐに対処することが可能__です。

###メリット②：チームの生産性と効率アップ

メリット①の通り、自動テストで早期にバグを発見できるため、

__大きな問題になる前の小さな問題の内に、バグの発見が可能__です。

そのため・・・

__作業の手戻りが小さく、開発者はバグ対応にかける時間を短縮し、機能の追加により多くの時間を費やすことが可能__になります。

##『CI』を実践するデメリット【１つ紹介】

![despaired-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/651140b3-9a10-e1b7-52ec-35c6643878f5.jpeg)

『CI』を実践するデメリットとして、挙げるとすれば…

- __テストコードを書く等の作業が発生する__

があるかと思います。

テストの自動化を行うにあたっての環境構築やテストコードの作成等の作業が発生するため、準備工数としては、手動に比べて多くなります。

そのため・・・

__工数を手動テストと比較して、効果が期待できそうになければ、自動化しないでOK__かと思います。

##テスト自動化を実践する前に考えたいこと【１つ紹介】

![camera-coffee-colorful-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/91215418-fffb-1389-53a8-f0d8ebcfb5a4.jpeg)


テスト自動化を実践する前には…

- __適用範囲__

について考えることが大事です。

###【重要】テスト自動化を実践する前には、『適用範囲』を考える

そもそも、理解しておきたいのは…

__『自動化してメリットがある範囲』__と__『自動化できる範囲』__は、__必ずしもイコールではない__ということです。

自動化にも__『向いてるモノ』『向いていないモノ』__があるので・・・

__"全てのテストを自動化しなければいけない"__

という訳ではありません。

ですので・・・

- __『これは自動化するべきだな』__
- __『これは手動でした方が良さそうだな』__

ということを、テスト自動化を取り入れる前に、明確にしておく必要があります。

例えば、下記のような感じ。↓↓↓

>__＜自動化に向いているモノ＞__

>- 仕様が安定してきた（固まってきた）機能のテスト
- 一つの機能に対して、複数の異なるデータで行うテスト<br>
→（例）テキストボックスに、漢字や数字が入るか
- 運用・保守の作業で行うテスト

>__＜自動化に向いていないモノ＞__

>- 納期が短く、その後運用・保守を担当する予定がないアプリケーション

##まとめ・感想

![surfing-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/7554b085-7ac1-da07-034c-c4425dad4e62.jpeg)

実際は、もう少しあるかなと思いますが…

一旦リリースします！

テストの自動化に関しては、『業務でも積極的に取り入れて行きたい』と思ってましたが、今回まとめてみて…

- __なぜテストを自動化するのか__

について、深く考えるいい機会になりました。

次回は、__『自動化を支えるツール』__などについてまとめる予定です。