Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テストゼロからイチに進むための戦略と戦術

 テストゼロからイチに進むための戦略と戦術

Japan Java Users Group Cross Community Conferrence 2016 Spring

Yu Watanabe

May 25, 2016
Tweet

More Decks by Yu Watanabe

Other Decks in Technology

Transcript

  1. 3 • 渡辺 祐 • (株)ビズリーチ • ビズリーチ エンジニアブログ ◦

    http://tech.dcube.io • Twitter: @nabedge • https://github.com/nabedge • http://www.slideshare.net/nabedge • http://mixer2.org • http://nabedge.mixer2.org
  2. 6

  3. 7

  4. ▸ 今日話さないこと ▹ TDD, テストファースト ▹ C0, C1, C2 ▹

    カバレッジ50%超えたらその後どうする? ▹ 例外処理のテストとか ▸ 話すこと ▹ 何を準備すべきか、そのコツ ▹ なにから始めるか ▹ その障害はなにか 12
  5. 13

  6. 25 ローカル開発環境の構築作業 1. git clone 2. vagrant up でOracleVBoxに仮想OSを起動し、 RDB,

    検索エンジン等をインストール 3. DBFluteのreplace-schemaで テーブル構築&初期データINSERT 4. バッチスクリプトで検索エンジンにデータ投入 5. Mavenプロジェクトとして IDE(Eclipse/IntelliJ)にインポート 6. ServerStarter.javaを起動
  7. 26 Jenkins上でのmvn test 1. git clone 2. vagrant up で別EC2インスタンスを起動し

    RDB, 検索エンジン等をインストール 3. DBFluteのreplace-schemaで テーブル構築&初期データINSERT 4. バッチスクリプトで検索エンジンにデータ投入 5. mvn jacoco-prepare-agent test sonar:sonar 6. vagrant destroy (インスタンスは使い捨て)
  8. 27 ポイント 1. ローカル開発環境のデータ層を、 仮想OSもろともvagrant upの 一撃で作れるようにしてある。 a. 初期データ投入も自動スクリプトあり。 2.

    ならばそれをテスト自動実行の 環境(Jenkins)にも使えばいい。 a. 環境差分は仮想OSのIPアドレスくらい
  9. 29 テスト「だけ」が開発じゃない 1. 機能の追加、変更、廃止 2. バグの対応 3. インフラ、フレームワークの メンテ 4.

    セキュリティ的な対応 5. 新人育成、新メンバーの 立ち上がりサポート 全体を テストで 支える
  10. 31 将来構想(の一部) ▸ ローカル開発環境 ▸ 結合テスト環境 ▸ 社内β環境 ▸ 本番環境

    すべて Docker コンテナ化 インフラ用ansibleをローカル環境でも使えたら!?
  11. 36 オライリー本「実践JUnit」より ▸ 14.4.1 望ましいカバレッジの値 ▹ 「EclEmmaの開発者も含むほとんどの人々は、 70%以下のカバレッジは不十分だと...」 ▸ 14.4.3

    カバレッジの意義 ▹ カバレッジの値は単体ではほとんど意味がありま せん。重要なのは、値の増減の傾向です。カバ レッジの値を落とすことなく、徐々に上昇させてゆ くことを目指しましょう。
  12. 41 IDEをメンテしよう ▸ EclEmma ▹ 手元のeclipseでカバレッジを見る ▸ Quick JUnit ▹

    テストクラスとテスト対象クラスを行き来する ▹ ただしEclipse-luna/marsでは一部メニューが 動かない! ▸ IntelliJ IDEAなら上の機能はだいたいデフォルト搭載。
  13. 44

  14. 47 理想: レガシーコード改善ガイド 2.1 「単体テストとは」 次にあてはまるものは単体テストではない。 1. データベースとやり取りする 2. (以降

    割愛) 上記に該当するテストが悪いというわけではない。 … … (以下、テストが遅くなりがちだからダメという 話)
  15. 48 開発現場の現実 ▸ これでは ↓ お話にならない ▹ 「手順書通りにソースをIDEに インポートしてアプリを起動したら、データ がほとんど入ってないせいで、画面がま

    ともに動きません!」 ▸ すべての機能を正確に動かせる 初期データを一撃でINSERTする仕組み は(自動テスト云々に関わらず)必須
  16. 49 ▸ DBFluteのreplace-schema機能を使う 1. テーブルを全DROP 2. CREATE TABLE … 3.

    *.xlsに用意したデータをINSERT (日時情報は相対指定可能) ▸ 他のツールでも代替可能 ▸ sql-maven-plugin ▸ dbunit-maven-plugin ▸ Gradle, 自作bashスクリプト
  17. 50 正しいテストデータが常に存在する 前提でテストを書いてもよいことにする @Test public void test_foo() throws Exception {

    User user = userService.find(5L); Result result = fooService.doBar(user); assertThat(result)........ 会員番号5番のuserはこのテストに必 要なデータを全て持っている
  18. 51 ただし基本は勉強したうえで 用法用量を守って。 @Test public void test_foo() throws Exception {

    User user = new User(); user.setHoge = ...//テストに必要な値をその都度書く Result result = fooService.doBar(user); assertThat(result)........
  19. 54 • インストール ◦ $ gem install mailcatcher • 起動

    ◦ $ mailcatcher • 1025番でSMTP待ち受け • 1080番でブラウザでメール閲覧 • portは起動引数で書き換え可
  20. 56 mailcatcherをvagrantで自動構築 動作チェックと自動テストの両方で使う ▸ vagrant upで”gem install mailcatcher” ▸ アプリケーションの設定値を差し替え

    ▹ SMTPサーバのIPアドレスとport番号だけ ▸ 開発過程での目視での動作確認用途に使う。 ▸ テストコードではmailcatcherのAPIで 取得したjsonをアサートする。
  21. 58 Seleniumご存知ですよね @Test public void test_トップページ() throws Exception { WebDriver

    drv = new FireFoxDriver(); WebElement element = drv.get(“http://localhost:8080/”); assertThat(element.findById(“title”).getText()) .contains(“Hello World”) }
  22. 60 絶対防衛ラインの存在 ▸ ECサイト ▹ カートに入れる->入力,決済->注文完了メール ▸ ホテル予約サイト ▹ 予約ボタン

    -> 入力,決済 -> 予約完了メール ▸ 転職サイト ▹ 応募ボタン -> 入力 -> 応募がありましたメール
  23. 62 前提:アプリは組込Tomcatで起動 public class APStarter { public static start() {

    Tomcat tomcat = new Tomcat(); tomcat.start(); ... public static void main(String args[] argv) { start();
  24. JVM 64 テストクラス テスト対象 Seleniumでもカバレッジ測定 JaCoCo-Agent Jenkins用マシンのOS Vagrant仮想 OS 1.

    vagrant up 2. 初期データ投入 3. Xvfb起動 4. mvn prepare-agent test sonar:sonar HTTP start()
  25. 66 もしも多種類ブラウザでやるとしたら? JVM テストクラス テスト対象 JaCoCo-Agent Jenkins用マシンのOS Vagrant仮想OS JVM テストクラス

    テスト対象 JaCoCo-Agent Jenkins用マシンのOS Vagrant仮想OS JVM テストクラス テスト対象 JaCoCo-Agent Jenkins用マシンのOS Vagrant仮想OS JVM テストクラス テスト対象 JaCoCo-Agent Jenkins用マシンのOS Vagrant仮想OS
  26. 72 巨大ログをよくよく目grepすると ==> default: Existing lock /var/run/yum.pid: another copy is

    running as pid 3744. ==> default: Another app is currently holding the yum lock; waiting for it to exit... ==> default: The other application is: yum • テストではなくvagrant の段階 ! • yum install hogehoge でコケている。 • 他のyumが動いている??
  27. 73 vagrant up AMI起動 (vagrant-aws-plugin) yum update ... 他のOS起動シーケンス sshデーモン開始

    vagrant provision yum install hogehoge yum lock 微妙に時間が かかることがある テスト実行ジョブスタート
  28. 85 道標はあるほうがいい ▸ なにを、どこまでがんばれば、 どうなりそうか? ▹ ステップ数 ▹ テストカバレッジ ▹

    テストの成功、失敗、スキップ ▹ 重複ステップ数 ▸ 上記すべての過去の値との比較
  29. 87 言語やフレームワークは 最新ですか? ▸ If文の分岐網羅を気にするよりも Java8 の Stream API で書き直して

    見通しを良くする方が建設的。 ▸ Spring-testフレームワーク便利! ▹ ただしspring4.2以上
  30. 90 ▸ テストの原則は ▹ 繰り返し可能である ▹ 独立している ▸ これを↑実行環境レベルの自動化で 実現する方法「も」ある

    ▸ ただし実行スピードが犠牲に なりやすい。考えて使いわける。 基本は基本で知っておこう