Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

テスト駆動&オブジェクト指向ハンズオン

521 views

Published on

2017/10/22の勉強会で使用した資料です。

* https://sitoolkit.doorkeeper.jp/events/65784
* https://sitoolkit.connpass.com/event/68422/

Published in: Technology
  • Be the first to comment

  • Be the first to like this

テスト駆動&オブジェクト指向ハンズオン

  1. 1. テスト駆動&オブジェクト指向再入門 正しく動くプログラムを綺麗なソースコードで実装する方法
  2. 2. • はじめに (5分) • 課題プログラムの説明 (5分) • ハンズオン • 前半 (30分) • 後半 (30分) • まとめ (10分)
  3. 3. はじめに
  4. 4. 株式会社モノクレア • SIプロジェクトの技術コンサルティング • アプリケーションアーキテクチャ • 開発方法論 • テスト自動化 • CI/CD
  5. 5. 課題プログラム
  6. 6. 課題プログラム:バッチアプリケーション • 仕様 • 実行するとディレクトリ以下の全Excelファイルを読み込み、HTML形式 のレポートを出力する。 • ディレクトリイメージ testscript └─dir1 └─dir2 ExcelTestScript1.xlsx ExcelTestScript2.xlsx
  7. 7. 課題アプリ • Excelファイルの形式 • SI-Toolkit for Web Testingのテストスクリプト • https://github.com/sitoolkit/sit-wt-all/raw/master/sit-wt- runtime/testscript/SampleTestScript.xlsx • HTMLレポートイメージ No. 項目名 操作 ロケーター 形式 ロケーター ケース_001 ケース_002 1 開始URL open input.html y y 2 名前 input id name 試験太郎 試験 3 名前 input append:花子 4 性別 choose name 性別 男性 女性 5 都道府県 select id prefecture 青森 6 市区町村 select id city 青森 TestScript StepCount dir1/dir2/TestScript1.xlsx case:001 3 dir1/dir2/TestScript1.xlsx case:002 6 dir1/dir2/TestScript2.xlsx case:001 10
  8. 8. 作業順序 • 環境構築 • インストール • プロジェクト作成 • 技術検証 (テスト駆動プログラミング) • 出力機能の実装 • 入力機能の実装 • リファクタリング (オブジェクト指向プログラミング) • 振る舞いモデリング • 構造モデリング
  9. 9. 環境構築
  10. 10. インストール • 以下のソフトウェアをインストールする。 • Excel or LibreOffice • JDK 1.8 • Eclipse Oxygen
  11. 11. プロジェクト作成 • Eclipseで「シンプルなMavenプロジェクト(アーキタイプ選択無し)」を作成 1. 「File」メニュー>「New」>「Maven Project」を選択 2. 「Create a simple project …」を選択して「Next」ボタンをクリック
  12. 12. プロジェクト作成 3. 「Group Id」に「a.b.c」(任意)、「Artifact Id」に「sit-wt-report」(任意)を入力して 「Finish」ボタンをクリック
  13. 13. プロジェクト変更 1. pom.xmlにプロパティを追加 2. プロジェクトを右クリック>Maven>Update Projectを選択 <project> <modelVersion>4.0.0</modelVersion> <groupId>a.b.c</groupId> <artifactId>sit-wt-report</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>
  14. 14. プロジェクト変更 3. 「Update Maven Project」ダイアログで「OK」ボタンをクリック 4. プロジェクト以下に「JRE System Library [Java SE-1.8]」が表示されることを確認
  15. 15. 補足:推奨Eclipse設定 • Save required dirty editors before launching -> Always • Launch Option -> Always launch the previously launched application
  16. 16. 技術検証
  17. 17. 技術検証 • 検証すべき技術要素 • Excelの読み込み • HTMLファイルの出力 • テスト駆動の基本的な考え方 • 仕様を確認できるテストを自動化する事から始める • 今回の場合は、、、 • レポート出力機能から着手する 1. テンプレートエンジンのサンプルコードを動かす 2. 期待する出力結果(レポート)を作る 3. テストを作る 4. 機能を作り込む
  18. 18. 技術検証 テンプレートエンジンの実行 • 今回はテンプレートエンジンにFreeMarkerを使用 1. “freemarker example”で検索 2. 検索結果を上位から以下の観点で確認 • 自分が欲しい機能に関するソースコードがあるか? • 各ソースコードのファイル名、配置場所が明確か? • エントリーポイントが明確か?(mainメソッドがあるか?) 3. サンプルに従いファイルを作成、ソースコードを張り付けてmainメソッドを実 行
  19. 19. 技術検証 期待結果の作成 • ここではBootstrapのテンプレートを使用 • “bootstrap”で検索→Get Started • プロジェクト直下にexpected.htmlファイルを作成し貼り付け
  20. 20. 技術検証 期待結果の作成 • 仕様のHTMLレポートの体裁となるようにexpected.htmlを実装 • ここではBootstrapのTableを使用 • サイドバー Content→Tables
  21. 21. 技術検証 テストクラスの実装 • JUnitのdependencyをpom.xmlに追加 • 出力したファイルと期待結果の各行が一致することをassertするテストクラス、 テストメソッドを実装 • Eclipse Plugin “Quick JUnit“をインストールすると「Ctrl + 9」のショート カットでテストクラスの作成、実行クラス⇔テストクラスの切り替えが可能 public class RunnerTest { @Test public void test() throws Exception { Runner.main(new String[0]); List<String> actual = Files.lines(Paths.get("output.html"), StandardCharsets.UTF_8).collect(Collectors.toList()); List<String> expected = Files.lines(Paths.get("expected.html"), StandardCharsets.UTF_8).collect(Collectors.toList()); for (int i = 0; i < expected.size(); i++) { assertThat("line:" + i, actual.get(i), is(expected.get(i))); } } }
  22. 22. 技術検証 Excelファイルの読み込み • 今回はExcelの読み込みにApache POIを使用 • “poi example”で検索 • サンプルに従いファイルを作成、ソースコードを張り付けてmainメソッドを実 行
  23. 23. リファクタリング
  24. 24. リファクタリング 振る舞いモデリング • 仕様 実行するとディレクトリ以下の全テストスクリプト(Excelファイル)を読み込み、 HTML形式のレポートを出力する。 • 振る舞いモデリング プログラムの処理をオブジェクトの振る舞い(メソッド)として可視化する。 メソッドのシグニチャは述語、目的語、動作の結果を明確にする。 • モデリング例 TestScriptReader ReportWriterReportGenerator read(directory) List<TestScript> write(List<TestScript>) execute report.html TestScript.xlsx
  25. 25. リファクタリング 構造モデリング • 構造モデリング プログラムが意識すべきモノとその属性、モノ同士の関連を可視化する。 • プログラムが意識すべきモノ:レポート • レポートにはN個のテストスクリプトが含まれる • テストスクリプトには1つのファイルパスとN個のテストケースが含まれる • テストケースはケース名とステップカウントを持つ • モデリング例 TestScript filePath TestCase name stepCount * Report * 11
  26. 26. リファクタリング 実装 • モデリングの結果をソースコードに反映する。 • 最上位の処理フローから仕様が読み取れるように! public class ReportGenerator { TestScriptReader reader = new TestScriptReader(); ReportWriter writer = new ReportWriter(); public static void main(String[] args) { new ReportGenerator().generate(Paths.get("testscript"), Paths.get("report.html")); } public void generate(Path targetDir, Path reportFile) { List<TestScript> testScripts = reader.readRecursively(targetDir); writer.write(testScripts, reportFile); } }
  27. 27. まとめ
  28. 28. まとめ • 速く正確に綺麗なソースコードを実装するための作業順序とポイント 1. 技術検証 アウトプットの処理から着手しましょう。 2. テスト自動化 受入テスト(仕様を確認するテスト)から自動化しましょう。 3. リファクタリング 最上位の処理フローから仕様が読み取れるようにリファクタリングしましょう。 1~3を繰り返して機能をテストコードを徐々に育てていきましょう。
  29. 29. ご参加ありがとうございました! SmartなSIを!

×