テスト自動化とそれを支えるツール 研修コースに参加してみた
今回参加した研修コースは テスト自動化とそれを支えるツール です。
SEカレッジではこれまでもテストに関するコースが数多く実施され、この「参加してみた」でもレポートしていますが、いよいよテスト自動化です。
参加してみると、テスト自動化とその目的である CI ( Continuous Integration 継続的インテグレーション ) について、そもそもなぜやるのか、導入するメリット / デメリットや投資効果、チェックポイントなどを解説いただき、これから取り組もうかと思う方にはとてもオススメでした。
また演習では私自身、一番興味のあった E2E テスト を自動実行するデモもあり、あーコレやコレや、これがやりたかったんや、という気持ちになりました。
では、どんな内容だったのかレポートします !!
もくじ
コース情報
想定している受講者 |
|
受講目標 |
|
講師紹介
今回登壇されたのはテスト系コースでも登壇の多い 大石 宏一さん です。この参加レポートをご覧いただく前に、これまでのレポートを見ると、理解が進みますので、ぜひ!
テスト自動化を支えるツール
-
5 つのツールが無いと成り立たない
- テストツールに目が行きがちだが、 CI ツールは必須
- SCM はだいたい普及しているので使っています
- ビルドツールが無いとテストツールを呼び出せません
- ビルドが無いと手動でテストツールをコールする必要がある
-
実行の流れ
- CI ツール ( Jenkins など)
- SCM を見に行く ( SVM, Git など)
- (変更があれば) ビルドツールが走る ( Maven など)
- テストツールを実行 ( JUnit, Selenide など)
- テスト結果をバグ管理ツールに投げる ( RedMine など)
重要なことはバグを放置しない、ということでした。バグをどんどん見つけたいという仕組みなのに、放置するのでは価値がなくなってしまいます。
ちなみに、大石さん所属のクロノスさんの場合、 Project が立ち上がると自動でこの 5 つが自動的に立ち上がるとのことでした。 いちいち CI 環境構築するのも面倒なので、極力ストレスなく、またスグに始められる、というのはとてもいいプラクティスですね。
CI Continuous Integration 継続的インテグレーション とは
- Continuous Integration 継続的インテグレーション
- 別々に開発された部品の「統合テスト」を早い段階から行う
- 早い段階からやるというのがポイント
- IBM の発表では・・・
- 上流工程で 45 % ~ 80 % のバグが生まれている
- 総工数の 40 % ~ 60 % は手戻り工数
- CI のメリット
- 例えば、共通部品チームとサブシステム開発チームが別々に開発していた場合
- お互いのコミットを取得してないためにバグが発生
- 誰の責任か? 不毛な開発チーム戦争が勃発
- CI を入れるとこんなことはない
- バグの素早い検知
- 手動 -> 自動化による効率化と人による依存が無くなる
- 秘伝のビルドがなくなる
- テスト結果を誰もが見える
- 例えば、共通部品チームとサブシステム開発チームが別々に開発していた場合
全然このコースのスコープではありませんが、この CI や DevOps という文脈で GitHub からワークフローを定義できる GitHub Actions が発表されましたね。( Docker を使うので、弊社の場合、まずはそこから… )
テスト自動化のポイント
テスト自動化のメリット / デメリット やるかやらないか
- 受託開発なのか (リリースまで)
- リリースまでだと自動化するコストが回収できないことが多い
- 本体のコードだけでなくテストコードを書いたり、バグ発生や仕様変更のたびにメンテナンスする必要があるため
- 大石さんの感覚的には契約からリリースまで 1 年以上かかる場合は自動化する
- 半年以内なら自動化しない
- 製品開発なのか (運用保守までやる)
- 絶対にやるべき
- すべてのテストを自動化すべきではない
- やって “おいしいところ” だけをやる
- 同一シナリオで引数だけが変わる
- ビルドの変更やパッチ適用のたびに繰り返す
- 仕様が安定してきた機能 <-> 不安定の場合はやらない
- やらなくてよいところ
- 信憑性のない数字だけど 4 回が分岐点
- やって “おいしいところ” だけをやる
テスト自動化の効果
- 手動テストと比較すること
- 自動化の準備工数は、手動の 2 ~ 5 倍
- テストの実施工数は 1 / 10 ~ 1 / 20
- 工数もさることながら精神的な方が大きい
- 例えば、 300 のテストケースがあって 299 個めでテストが落ちた場合 …
テスト自動化の導入プロセス
- メンバーが下に挙げることをやらないと導入の意味がない
- バグやエラーを放置しない
- エラーが出たら製品コードだけでなくテストコードも修正すること
- 製品コードより先にテストコードを書く
- とはいえ、クラスもないのにテストコードを書くのはツラい
- なので、製品コードとテストコードを交互に書くような感じ
- バグやエラーを放置しない
ツールの使い方 Selenide
このコースでは実際に Selenide (セレニド) というツールを使うので、その解説です。
- 正常系のパターンからやることがポイント
- スキマ時間でやることが多いと時間効率がよい
- 異常系は何かあったら追加していく -> 育てていくという感覚
- できること
- Web 画面のテストケースをコード化
- 主要なブラウザに対応
- キャプチャも自動で取得できる
- Selenide は Selenium のテストラッパー
- Selenium はブラウザの操作を自動化するもの
- Seleniude は Firefox のプラグイン
- 他ブラウザなら別に WebDriver が必要
混同していたのですが、 Selenium はスクレイピングなど含めた自動操作、 Selenide はテストラッパーなんですね。
ちなみに Web アプリケーションの E2E テストの自動化は皆さん、どのようにされているのでしょうか。(結構、検知が難しい…)
テスト自動化と CI ツール演習 !!
ここからは実際に Selenide と JUnit を使ってテストを自動化してみます。
Selenide でブラウザのテストをやってみる
- 実行環境
- JDK 8
- eclipse 4.7
- JUnit 4 // 5もあるが、まったく違う (とっつきやすいのは 4 )
- ビルドを通す
- Selenide.jar をビルドパスに通す
- ちなみにビルドには役割が 2 つある
- 手動の操作を自動化
- ライブラリの管理
- 依存関係を POM.xml に書く
- ドライバーを入れる
- Chrome でやるので chromeDriver.exe を用意する
- 一旦テストしよう
- テストコードはシンプルに
- テストコードにバグを入れないために、ブロック演算子やif文、for文などは使わないほうがよい
実行してみると、自動的にブラウザが立ち上がって、実行されるのはちょっと壮観です。
<dependencies>
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
package sample;
import static com.codeborne.selenide.Condition.text;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.open;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.openqa.selenium.By;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideElement;
import com.codeborne.selenide.WebDriverRunner;
public class CalculatorTest {
@Test(expected = Exception.class) // @Test でテスト対象にする
public void 数量0でcalcを呼び出すと例外が発生する() throws Exception { // 日本語で書いておくと結果がわかりやすい
Calculator.calc(100, 0);
}
@Test
public void 数量1でcalcを呼び出す() throws Exception {
// setup 準備
int price = 100;
int count = 1;
int expected = 100;
// when
int actual = Calculator.calc(price, count);
// then 検証
assertThat(Calculator.calc(100, 1), is(100)); // assertThatメソッドをよく使う第1引数と第2引数が一致している
}
/* 中略 */
/**
* Selenideテスト
*/
@Test
public void selenideTest() {
// Configure Chrome driver
Configuration.browser = WebDriverRunner.CHROME;
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
// ブラウザでGoogleを開く
Selenide.open("http://www.google.com/");
// Google検索
SelenideElement element = Selenide.$(By.name("q")); // htmlのname属性をターゲットに
element.val("selenide").pressEnter();
// 検索結果を確認
ElementsCollection results = Selenide.$$(By.cssSelector("#ires .g"));
results.shouldHaveSize(10);
results.get(2).shouldHave(Condition.text("Selenide: concise UI tests in Java")); // 検索順位が3位...
}
}
もし自動テストをこれからプロジェクトに導入しようと思っている方には、このデモを見せるだけでプロジェクトチームの心が動きそうです。
Jenkins を使ってみる
続いて、ここからはそのテスト自動化を含めて、CIツールを使ってみます。CIツールとしては Jenkins を使うので、それを解説します。
- ヘルプが充実している!!
- 誤った設定をすると検出して、ヘルプページを表示する
- プラグインが充実している
- ビルドが通らないと、例えば、 Jenkins オジサンが怒るやつや松岡修造が出てきてコメントするプラグインが過去にありました
- もちろん真面目にグラフ化するものなど様々にある
- CIとして使うだけでなく cron実行 にも使える
- 例えば定期の定型メール送信
- 実行ログがわかる
- ジョブにタスクを書いていく
- SCM ポーリングでソースコードの変更履歴を取ってくる
ちなみに、大石さんから、 Jenkins の開発者は日本人 (!!) で、川口耕介さんという方で、当初、 Hudson という名前でサン・マイクロシステムズ時代に開発していたところ、オラクルがサンを買収後、 Hudson の商標を主張、、など逸話を紹介頂きました。
よく聴いているポッドキャストで川口さんが登場されているのを思い出し、聴いてみましたが、とても いいお声 でした! (そこではない.. もちろんその逸話も触れてらっしゃいました!)
Jenkins で CI を回してみる
実際にジョブにあるテストを実行してみます。(実際にはビルドなど様々なツールを連携させて、ワークフローにします)
- 実行結果の見方
- 赤色 -> ビルド失敗
- 黄色 -> ビルド成功 – テスト失敗
- 青色 -> ビルド成功 – テスト成功
ということで、ここからは実際にテストが失敗している箇所をデバッグして、成功するまで演習して、コースは修了しました。
まとめ
このコースではテスト自動化や CI をそもそもなぜやるのか、どうすると「オイシイ」のか、どういう構成なのか、現場的な観点からお話頂いた上で、実際に Selenide や Jenkins を使って演習してみました。
実際 E2E テストのデモは、見たことがない方 (つまり私…) にはとても刺さりやすいものだと思いました!
これからテスト自動化に取り組もうという方には、デモを含めて、どうするとプロジェクトチームに効きそうか、よい視座が提供できるコースなので、とてもオススメです !!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。