java web application testing

151
Java Web アプリケーショ ンのテスティングの話 JJUG CCC 2015 Spring tokuhirom

Upload: tokuhiro-matsuno

Post on 16-Jul-2015

3.101 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Java web application testing

Java Web アプリケーションのテスティングの話

JJUG CCC 2015 Spring tokuhirom

Page 2: Java web application testing

初心者向けっちゃ 初心者向け

Page 3: Java web application testing

コミュニティイベントなので コミュニティからのフィード

バック重視

Page 4: Java web application testing

答えを提供するよりは 議論の元を提供する感じで

Page 5: Java web application testing

自己紹介

Page 6: Java web application testing

自己紹介なんて 不要だと思うかもしれません

が。。

Page 7: Java web application testing

業種の前提が無いと、 聞いても無意味

Page 8: Java web application testing
Page 9: Java web application testing
Page 10: Java web application testing

自社サービスの ウェブアプリケーション

の開発

Page 11: Java web application testing

一昨年まで Perl 書いてたけど去年から Java

Page 12: Java web application testing

Native App 用の API サーバー等が主

Page 13: Java web application testing

Form Webapp

multipart/form-data application/x-www-form-urlencoded

HTML

従来手法

Page 14: Java web application testing

iPhone App Webapp

Android App

AngularJS App

JSON

JSON

近年のアプリ

Page 15: Java web application testing

開発手法の話

Page 16: Java web application testing

Agile

Page 17: Java web application testing

それをAgileと呼ぶならそれはAgileなのだろう

Page 18: Java web application testing

開発の手順

Server

Spec

Client

QA

Page 19: Java web application testing

Iterative

1.2

1.1

2.0

2.1

Page 20: Java web application testing

開発に利用している コンポーネント

Page 21: Java web application testing

Apache Tomcat MySQLJava8

Page 22: Java web application testing

普通だ!

Page 23: Java web application testing

自己紹介終わり。

Page 24: Java web application testing

本編です

Page 25: Java web application testing

質問は随時叫ぶなり手をあげるなりしてください。

Page 26: Java web application testing

原則

Page 27: Java web application testing

手動テスト最高ですね!!

Page 28: Java web application testing

(CENSORED)

Page 29: Java web application testing

ネイティブアプリ等は 機種ごとの差異なども

あるので 最終的には必要

Page 30: Java web application testing

どこまで自動化するか

Page 31: Java web application testing

手動でやるよりも 自動でやったほうが 楽になりそうだな~って ところまでやる。

Page 32: Java web application testing

ここ、テスト書いておかないと後で壊れそうだな

というところを、「契約」として

書いておく

Page 33: Java web application testing

Web Application でのテスト、どのレイヤでやるか。

Page 34: Java web application testing

どこまでスタブにするか

Page 35: Java web application testing

近代的WebApp

Browser Controller Model RDBMS

外部API

Page 36: Java web application testing

どこのレイヤでテストする?

Page 37: Java web application testing

Model のテストを手厚くやろう。

Page 38: Java web application testing

どうやる?

Page 39: Java web application testing

悩みどころ

Page 40: Java web application testing

Q. RDBMSまわりの テスト、どうやるか?

Page 41: Java web application testing

A. RDBMSとのつきあいかたによる

Page 42: Java web application testing

深い付き合い

浅い付き合い

Page 43: Java web application testing

1. RDBMS を絞り尽くしたい派

Page 44: Java web application testing

SQLをゴリゴリ 書きたい

Page 45: Java web application testing

2. JPA にすべてを委ねるよって人

Page 46: Java web application testing

JPAがRDBMSの差異を吸収してくれる。。

Page 47: Java web application testing

はず

Page 48: Java web application testing

RDBMS に依存しない 実装を求める

Page 49: Java web application testing

H2 でテストするぞ!!!

Page 50: Java web application testing

僕の場合

Page 51: Java web application testing

1 です。

Page 52: Java web application testing

JPA は使わないので。。

(CENSORED)

Page 53: Java web application testing

SQL書きたいよ?

Page 54: Java web application testing

一番テストしたいのは RDBMS とのつなぎ込み部分

Page 55: Java web application testing

RT 鍵: WEB+DB システムとは SQL と入出力仕様だ

Page 56: Java web application testing

というわけで、MySQLを利用したテストの仕方をご紹介し

ます。

Page 57: Java web application testing

よ~し、パパ MySQL を maven から 起動しちゃうぞ~

Page 58: Java web application testing

(CENSORED)

Page 59: Java web application testing

local に立ってる MySQL 使ってこ

Page 60: Java web application testing

CREATE DATABASE proj_test_deadbeef;

プロジェクト名 ランダム生成文字列

Page 61: Java web application testing

スキーマのSQLを流し込む!!!

Page 62: Java web application testing

for (SHOW TABLES) { DELETE FROM $_; }

@Before

Page 63: Java web application testing

マスターデータをINSERTする

Page 64: Java web application testing

自動生成したDBへの接続情報は DI かなにかでがんばって

設定しよう!!

Page 65: Java web application testing

DB のテストに関する 知見は以上になります。

Page 66: Java web application testing

休憩

Page 67: Java web application testing

外部APIのテスト

Page 68: Java web application testing

ところで、最近話題の microservices

Page 69: Java web application testing

SOA でもなんでもいいですが……

Page 70: Java web application testing

僕の周りでは10年ぐらい前 疎結合ウェブアプリケーション

と呼んでました。

Page 71: Java web application testing

コンポーネントを 細かい httpd に分けて HTTP で通信してこ↑

Page 72: Java web application testing

メリット: 分業しやすい

変更の影響範囲が明確

Page 73: Java web application testing

弊社でも、 バズワードが出る前から 実践されております。

(CENSORED)

Page 74: Java web application testing

しかし、 テストがやや やりにくい。

Page 75: Java web application testing

どうするか?

Page 76: Java web application testing

クライアントライブラリを DI で置き換える?

Page 77: Java web application testing

速い。

Page 78: Java web application testing

テスト範囲が狭くなって良くない面がある。

Page 79: Java web application testing

結合テストを別途行うならいいけど。。

Page 80: Java web application testing

httpd を起動して モックサーバーを実行する

Page 81: Java web application testing

Embedded Jetty

Page 82: Java web application testing

servlettester-jetty github.com/tokuhirom/

servlettester-jetty

Page 83: Java web application testing

JettyServletTester.runServlet((req, resp) -> { resp.getWriter().print("Hey"); }, (uri) -> { try (CloseableHttpClient client = HttpClientBuilder.create() .build()) { HttpGet request = new HttpGet(uri); try (CloseableHttpResponse resp = client.execute(request)) { String body = EntityUtils.toString(resp.getEntity(), StandardCharsets.UTF_8); assertEquals("Hey", body); } } });

Page 84: Java web application testing

http://localhost:12800/

Page 85: Java web application testing

httpd あげるの無駄なのでは????

Page 86: Java web application testing

無駄だけど、jetty なら起動速いし気にならない。

Page 87: Java web application testing

DB関連のほうが十分に遅いので。。

Page 88: Java web application testing

実際には、もっとシンプルに。。

Page 89: Java web application testing

apimock https://github.com/tokuhirom/apimock

Page 90: Java web application testing

Sinatra風にサーバー側実装を書ける

Page 91: Java web application testing

@Test public void test() { mockApi(mock -> {

mock.get(“/api/member/detail“,c -> { return ImmutableMap.of(“hoge”, “fuga”);

}); }, () -> {

assertEquals(”fuga}”, injector.get(Client.class).getMember(1)

.getHoge() );

} }

Page 92: Java web application testing

HTTPの通信を細かく書けないと、

Regression Test 書きづらい。

Page 93: Java web application testing

外部 API のテストに関する 知見は以上になります。

Page 94: Java web application testing

休憩

Page 95: Java web application testing

コントローラのテスト

Page 96: Java web application testing

コントローラのテスト、どうやるか

Page 97: Java web application testing

API サーバー のテスト

Page 98: Java web application testing

極めて書きやすい。

Page 99: Java web application testing

httpd をあげて Apache HttpClientでアクセスする。

Page 100: Java web application testing

servlettester-jetty

Page 101: Java web application testing

JettyServletTester.runServlet( new MyServlet(), (uri) -> {

// your test code } );

Page 102: Java web application testing

実際のテストコードでは。。。

Page 103: Java web application testing

ControllerTestBase クラス的なので自動的にサーブレット立ち上げる。

Page 104: Java web application testing

@Test public void test() { http.get(“/api/member/“) .isOK() .contentContains(“hogehoge”);

}

Page 105: Java web application testing

JSON API だったらどうすんの?

Page 106: Java web application testing

@Test public void test() { val req = new Req(“hoge”, “fuga”); Res res = mech2.postJSON(“/api/member/register“, req) .isOK() .parseJSON(Res.class); assertThat(res.getName()) .isEqualTo(“hoge”);

}

Page 107: Java web application testing

@Test public void test() { http.post(“/api/member/create“) .param(“name”, “John”) .isOK() .contentContains(“hogehoge”);

}

Page 108: Java web application testing

HTML のフォームとか……?

Page 109: Java web application testing

あんま真面目にテストしてない。。

Page 110: Java web application testing

人力のテストでカバーできるので。。

Page 111: Java web application testing

HTML 変わりまくるので、自動化テストの手間が 見合わない。

Page 112: Java web application testing

コントローラのテストの話は終わり。

Page 113: Java web application testing

ダミーデータの作成

Page 114: Java web application testing

public class TestBase { @Inject protected Creator create;

}

Page 115: Java web application testing

@Test public void test() { Member member = create.member(); Blog blog = create.blog(member); // …

}

Page 116: Java web application testing

fixture.yml 的なの メンテナンスが面倒

Page 117: Java web application testing

Web 屋さん、 Excel 嫌いな人もいるので。。

Page 118: Java web application testing

ダミーデータ作成の話、 終わり。

Page 119: Java web application testing

テストライブラリ どれがいいのか、という話

Page 120: Java web application testing

junit3 vs junit4

Page 121: Java web application testing

junit4 世代なので、素直に junit4 つかってます

Page 122: Java web application testing

assertThat(actual, is(expected));

Page 123: Java web application testing

読む分にはいいけど、書きづらい。。

Page 124: Java web application testing

assertj を使う

Page 125: Java web application testing

assertThat(actual) .isEqualTo(expected)

Page 126: Java web application testing

補完が効きやすい = IDE Friendly

Page 127: Java web application testing

assertThat(list) .hasSize(5)

Page 128: Java web application testing

開発が活発

Page 129: Java web application testing

assertThat(uri) .hasPath(“/“) .hasPort(80);

Page 130: Java web application testing

先週ぐらいに要望だしたら、だれか実装してた。

Page 131: Java web application testing

ところで、、

Page 132: Java web application testing

Google truth ってどうなの?

Page 133: Java web application testing

dagger2 とか、google 発プロダクトで利用されてる

Page 134: Java web application testing

だいたい assertj と一緒

Page 135: Java web application testing

コードが小難しい assertj のほうが好き

Page 136: Java web application testing

まとめ

• assertj 便利。

Page 137: Java web application testing

Continuous Integration

Page 138: Java web application testing
Page 139: Java web application testing

全体の構成

Page 140: Java web application testing

gh:e jenkinsエンジニア

Nexus Enterprise

Deploy System

ServerServer Server Server

Page 141: Java web application testing

Nexus Enterprise へは jenkins からしか上がらない

Page 142: Java web application testing

テスト通らないコードはリリースできない

Page 143: Java web application testing

CI は誰かがお膳立てしてあげればみんな諦めて使う

Page 144: Java web application testing

Findbugs checkstyle

Page 145: Java web application testing

gh:e から p-r 投げたら テストが自動で回る

Page 146: Java web application testing

CI ないと、テストは ぶっ壊れる

Page 147: Java web application testing

CI 回さないと 自分の書いたコードを

誰かが壊す

Page 148: Java web application testing

CI は基本。

Page 149: Java web application testing

僕のやり方まとめ• DB のテストは実際に DB を使う

• 外部 API のテストは実際に API をコールする

• コントローラのテストはサーブレットコンテナを起動する

• CI を常に回す

Page 150: Java web application testing

おしまい

• (CENSORED)

Page 151: Java web application testing

以上。