テスト駆動開発入門 ネクストステップ

Similar documents
スライド 1

テスト駆動開発入門

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

メソッドの外部設計とテストファースト

プログラミング入門1

スライド 1

メソッドのまとめ

デベロッパーテスティング ソフトウエア開発者の基礎体力

<4D F736F F F696E74202D20835C CC967B8EBF2E B8CDD8AB B83685D>

はじめてのコンコリックテスト

Using VectorCAST/C++ with Test Driven Development

8 / 0 1 i++ i 1 i-- i C !!! C 2

28th Embarcadero Developer Camp


Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint - 09.pptx

発表内容 背景 コードクローン 研究目的 4 つのテーマ 研究内容 テーマ毎に, 概要と成果 まとめ 2

GEC-Java

スライド 1

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

システム操作インターフェイス最適化によるテスト自動化ROI向上

プログラミング基礎I(再)

Program Design (プログラム設計)

人工知能入門

An introduction and future of Ruby coverage library

基礎計算機演習 実習課題No6

Visual Studio 2013 による単体テスト 2014 Microsoft Corporation. All rights reserved. 1

HIGIS 3/プレゼンテーション資料/J_GrayA.ppt

スライド 1

TestDesign for Web

プログラミング入門1

JavaプログラミングⅠ

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

スライド 1

プログラミング基礎

問題1 以下に示すプログラムは、次の処理をするプログラムである

話すこと (Topics) 私とテスティングフレームワーク (Testing frameworks and I) テスティングフレームワークの作り方 (how to create testing frameworks) 1/42

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

デバッグの工夫

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

システム操作インターフェイス最適化によるテスト自動化ROI向上

D5-2_S _003.pptx

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

コンテナでテストをまわせ! Java EE への自動テストの導入 1 小西高之 JBoss Technical Support Engineer Red Hat K.K.

プログラミングA

過去問セミナーTM

Microsoft PowerPoint ppt

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Prog2_9th

JavaプログラミングⅠ

Microsoft PowerPoint - reject_talks_2007.ppt

C C UNIX C ( ) 4 1 HTML 1

プログラミング基礎

プログラミングA

Microsoft PowerPoint - chap10_OOP.ppt

Microsoft Word - 【第5分科会】ConcolicTestingグループ_付録_修正_ doc

プログラミング入門1

JBoss と Arquillian で実現する 究極のテスト環境 レッドハット株式会社 JBoss サービス事業部 コンサルタント 山 田義和

基礎プログラミング2015

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

JavaプログラミングⅠ

スライド 1

Microsoft PowerPoint pptx

Prog2_12th

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - Tsuzuki.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション


5-3- 応統合開発環境に関する知識 1 独立行政法人情報処理推進機構

JavaプログラミングⅠ

WPF アプリケーションの 多言語切替

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

デザインパターン第一章「生成《

ML 演習 第 4 回

On-Demand Test Suite Reduction

プログラミング入門1

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

プログラミング入門1

Microsoft PowerPoint - C++_第1回.pptx

Microsoft Word - VBA基礎(6).docx

前回のあらすじ 物理演算ライブラリ chipmunk を使って チキンが地面に落ちるところまで

PowerPoint Presentation

はじめに 原因結果グラフ技法を学ぼう まずは 原因結果グラフ について解説します 例題を使って 原因結果グラフ を描いてみます 演習問題のグラフを作ってみよう まずは一人で描いてみよう 近くの人とグラフの違いを見比べてみよう ツールを使って使ってみよう 支援ツール CEGTest を使って 演習問題

アスペクトの相互作用を解消するアスペクトの提案

V8.1新規機能紹介記事

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

Java講座

問題1 以下に示すプログラムは、次の処理をするプログラムである

040402.ユニットテスト

Java から見たオブジェクト指向入門 オブジェクト指向 AtoZ セミナー ( 株 ) 豆蔵井上樹

2

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

目次 ペトリネットの概要 適用事例

Microsoft PowerPoint - Session4古賀様.ppt

Transcription:

テスト駆動開発入門 ネクストステップ 井芹洋輝

謝辞 主催の今給黎さん 和田さん 会場提供 スタッフの方々 参加者の皆さま 深くお礼申しあげます

自己紹介 井芹洋輝 (@goyoki/id:goyoki) 組み込みエンジニア WACATE 実行委員 /TDD 研究会 講演 / 執筆 : XP 祭り関西 ユニットテストの保守性を作りこむ Androidテスト祭り テストの活用による開発効率化 並カン FPGA/HDLを活用したソフトウェア並列処理の構築 等

概要 本講義はTDDの基本サイクルを学んだ方が対象です 本講義ではTDDを開発で実践するための知識 TDDについて自立して学習を進めるための知識を学び 一人前のTDD 使いへのスタートアップを手助けします

概要 TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

実践のネクストステップ TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

実践のネクストステップ TDDを継続していくと TDDの基本サイクルにテストの再利用と変更のタスクが加わります それらはしばしばTDDの効率を左右するため工夫や対策が必要です

テストを整える TDD 実践のネクストステップ テストを 整える 変更に 備える 変更を 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

テストを整える TDDであってもテスト設計を見直し テストに穴がないか これまでの作業が適切だったかチェックする必要があります 不適切なテストは実装ミス リファクタリングでのデグレードを見逃し テストの再利用を阻害するリスクを持っています

テストを整える テストの網羅度をチェック 仕様ベースの網羅 テストが仕様を網羅しているか 仕様ベースのテスト設計等 4 で割り切れる N Y Y Y 100 で割り切れる N N Y Y 400 で割り切れる N N N Y うるうどし N Y N Y 構造ベースの網羅 テストがコードを網羅しているか コードカバレッジ等 // うるう年か判定する bool isleapyear(unsigned int year) if (year % 400 == 0) return true; if ((year % 4 == 0) && (year % 100!= 0)) return true; return false;

仕様ベースの網羅 ex) 同値分割法によるチェック 出力やふるまいで同じように扱えるグループに 入出力をグルーピングする グループを同値クラスと呼ぶ

仕様ベースの網羅 ex) 同値分割法によるチェック 6 歳未満は無料 6 歳以上 12 歳以下は半額 13 歳以上は定額

仕様ベースの網羅 ex) 同値分割法によるチェック 6 歳未満は無料 6 歳以上 12 歳以下は半額 13 歳以上は定額 出力をグルーピング 無料 半額 定額

仕様ベースの網羅 ex) 同値分割法によるチェック 6 歳未満は無料 6 歳以上 12 歳以下は半額 13 歳以上は定額 入力もグルーピングし 入出力のグループを抽出 0 6 12 - + 年齢 ありえない無料半額定額 4 つにグルーピング

仕様ベースの網羅 ex) 同値分割法によるチェック 6 歳未満は無料 6 歳以上 12 歳以下は半額 13 歳以上は定額 グループごとに代表値を決めてテストの入力値を抽出 0 6 12 - + ありえない無料半額定額 代表値 -1 代表値 0 代表値 5 代表値をテストの入力に指定 代表値 6 代表値 12 代表値 13

仕様ベースの網羅 ex) 同値分割法によるチェック TEST(HogeTest, Invalid) EXPECT_EQ(, checkfee(-1)) TEST(HogeTest, Free) EXPECT_EQ(, checkfee(0)) EXPECT_EQ(, checkfee(5) TEST(HogeTest, Half) EXPECT_EQ(, checkfee(6)) EXPECT_EQ(, checkfee(12)) テストコードがグループや代表値を網羅しているかチェック穴があれば埋める あるいは最初から意識してテストを書く TEST(HogeTest, Full) EXPECT_EQ(, checkfee(13))

構造ベースの網羅 コードカバレッジを用いる テストが妥当なブランチカバレッジやループカバレッジの網羅性を持つことをチェック 穴があれば埋める

変更に備える TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

変更に備える TDDではテストをリファクタリングや自動回帰テストとして再利用するため テストに保守性が要求されます 柔軟な開発を支えるためにも プロダクト / テストを区別せずコードを洗練させる必要があります

変更に備える テストは変更を支える砦となりえますが 同時にテストは変更の障害ともなりえます テストコードも保守困難なレガシーコードとなります

変更に備える 読みやすくする 危ないコードを分離する 重複をなくす 影響範囲を限定する / 副作用をなくす

変更に備える 読みやすくする 危ないコードを分離する 重複をなくす 影響範囲を限定する / 副作用をなくす

読みやすくする 何をテストしているのかわかりやすい 変更箇所の特定が楽 変更ミスを防げる テストのバグを見つけやすい

読みやすくする TEST(HogeTest, Test1) TEST(testHoge, Test2)

読みやすくする TEST(HogeTest, Test1) TEST(testHoge, Test2) なんのテストかわからない

読みやすくする TEST(HogeTest, commandinputinvaliderror) TEST(HogeTest, commandinputboferror) 適切な名前を与える

読みやすくする TEST(HogeTest, Fuga) MotorStatus motorstatus(133, 232); InspectionFuga inspector; inspector.set(createmaintenanceinfo(motorstatus); EXPECT_EQ(START, inspector.getstate()); EXPECT_EQ(true, inspector.isempty()); inspector.initialize(); EXPECT_EQ(INFO, inspector.getstate()); EXPECT_EQ(false, inspector.isempty());

読みやすくする TEST(HogeTest, Fuga) MotorStatus motorstatus(133, 232); InspectionFuga inspector; inspector.set(createmaintenanceinfo(motorstatus); EXPECT_EQ(START, inspector.getstate()); EXPECT_EQ(true, inspector.isempty()); inspector.initialize(); 何をテストしているかが散漫 テストのバグをみつけにくい EXPECT_EQ(INFO, inspector.getstate()); EXPECT_EQ(false, inspector.isempty());

読みやすくする TEST(HogeTest, FugaConstractor) InspectionFuga inspector = createinspectionfugadummy(); EXPECT_EQ(START, inspector.getstate()); EXPECT_EQ(true, inspector.isempty()); TEST(HogeTest, FugaInitialize) InspectionFuga inspector = createinspectionfugadummy(); inspector.initialize(); EXPECT_EQ(INFO, inspector.getstate()); EXPECT_EQ(false, inspector.isempty()); 分離し適切な名前を与える

変更に備える 読みやすくする 危ないコードを分離する 重複をなくす 影響範囲を限定する / 副作用をなくす

危ないコードを分離する TEST(FooTest, Bar) MotorStatus motorstatus(0, 0); MaintenanceData mtdata; MaintenanceType mttype(createregionid(eu)); setinitialdata(mtdata, mttype); InspectionFuga inspector; inspector.set(maintenanceinfo(mtdata, mttype), motorstatus); EXPECT_EQ(inspector)

危ないコードを分離する プロダクトコードに過依存 TEST(FooTest, Bar) MotorStatus motorstatus(0, 0); MaintenanceData mtdata; MaintenanceType mttype(createregionid(eu)); setinitialdata(mtdata, mttype); InspectionFuga inspector; inspector.set(maintenanceinfo(mtdata, mttype), motorstatus); その他 : 変更リスクの高いコード堅牢性の劣るコード

危ないコードを分離する [ テスト側でラッピング ] TEST(FooTest, Bar) InspectionFuga inspector = CreateInspectionFuga(0, EU); inspector.set(maintenanceinfo(mtdata, mttype), motorstatus);

危ないコードを分離する [ プロダクト側のインターフェースを改善 ] TEST(FooTest, Bar) InspectionFuga inspector(0, 0, EU); inspector.set(maintenanceinfo(mtdata, mttype), motorstatus);

変更に備える 読みやすくする 危ないコードを分離する 重複をなくす 影響範囲を限定する / 副作用をなくす

重複をなくす [Test Utility Method] TEST_F(BuyerTest, addsamestatus) Buyer buyer; Customer customer1("taro", "Yamada", 15, 2, "HOGE FUGA"); customer1.addcategory(state_active); Customer customer2("taro", "Yamada", 15, 2, "HOGE FUGA HOGEHOGE"); customer2.addcategory(state_active);. buyer.add(customer1); buyer.add(customer2);. EXPECT_EQ(0, buyer.getsection());

重複をなくす [Test Utility Method] TEST_F(BuyerTest, addsamestatus) Buyer buyer; Customer customer1 = createcustomer("hoge FUGA"); Customer customer2 = createcustomer("hoge FUGA HOGEHOGE"); buyer.add(customer1); buyer.add(customer2); EXPECT_EQ(0, buyer.getsection()); Customer createcustomer(string status) Customer customer("taro", "Yamada", 15, 2, status); customer.addcategory(state_active); return customer; Parameterized Creation Method

重複をなくす [Parameterized Test] TEST_P(HogeTest, InvalidValueMinus) Hoge hoge(-1); EXPECT_EQ(0, hoge.size()); TEST_P(HogeTest, InvalidValueZero) Hoge hoge(0); EXPECT_EQ(0, hoge.size()); TEST_P(HogeTest, InvalidValueTooBig) Hoge hoge(124566); EXPECT_EQ(0, hoge.size());

重複をなくす [Parameterized Test] class HogeTest : public testing::testwithparam<int> ; INSTANTIATE_TEST_CASE_P(InvalidValueInstance, HogeTest, testing::values(-1, 0, 124566)); TEST_P(HogeTest, hogehoge) Hoge hoge(getparam()); EXPECT_EQ(0, hoge.size()); Parameterized Test

変更に備える 読みやすくする 危ないコードを分離する 重複をなくす 影響範囲を限定する / 副作用をなくす

影響範囲を限定する / 副作用をなくす Foo foo; TEST_F(HogeTest, Fuga) TEST_F(HogeTest, Piyo)

影響範囲を限定する / 副作用をなくす TEST_F(HogeTest, Fuga) Foo foo; TEST_F(HogeTest, Piyo) Foo foo; ローカル変数にするテストクラスのメンバにする

影響範囲を限定する / 副作用をなくす Void SetUp() 外部コンポーネントの初期状態を記録する TEST_F(Buyer, test_add_samestatus) 外部コンポーネントを使ってテスト. Void TearDown() 外部コンポーネントを初期状態にロールバックする 構造的にも時間軸的にも独立させる他のテストコードを変更しても結果が変わらない順序を変えても どのようなタイミングでも結果が変わらない

テストを整える & 変更に備える 実施タイミング TDDではプロダクト / テストを区別せずコードを洗練させていくべきです テストコードであっても良いコードを目指すべきですし プロダクトコードのリファクタリングと同じ扱いで設計改善すべきです

テストを整える & 変更に備える 実施タイミング RED Assert ファーストによる追加 変更 (RED GREEN) リファクタリング (Refactor) REFACT OR GREEN Green

テストを整える & 変更に備える 実施タイミング RED Assert ファーストによる追加 変更 (RED GREEN) テストコードの設計改善 (REFACTOR[TEST]) REFACTOR TEST PRODUCT GREEN Green テストを 整える リファクタリング (Refactor[PRODUCT]) テストを整える

変更に対処する TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

変更 TDDでは開発の進展 リファクタリング 仕様変更などによりしばしばプロダクトコードの変更が発生します TDDではプロダクトコードに依存するテストが早期から作られるため テストを以下に効率よく変更に対応させるかが効率確保の鍵となりえます

変更に対処する 1. よく考える (1.5. 変更を受け入れられるように設計改善 ) 2. RED 3. GREEN 4. REFACTOR

変更に対処する Class TestTarget void TestTarget(int hoge). TEST() TestTarget target(0); TEST() TestTarget target(1);.

変更に対処する Class TestTarget void TestTarget(int hoge). TEST() TestTarget target(0); TEST() TestTarget target(1);. TestTarget(int hoge) から TestTarget(int hoge, int fuga) に変更 Int fuga に応じて複雑な処理を

変更に対処する Class TestTarget void TestTarget(int hoge). よく考える TEST() TestTarget target(0); TEST() TestTarget target(1); TEST() 無理のない小さなステップで 効率よく変更できるように TestTarget target(2);. TestTarget(int hoge) から TestTarget(int hoge, int fuga) に変更 Int fuga に応じて複雑な処理を

変更に対処する [1] Parallel Change Class TestTarget void TestTarget(int hoge). void TestTarget(int hoge, int fuga) 新旧共存で TDD 逐次テストを置き換えていく TEST() TestTarget target(0); TEST() TestTarget target(1); TEST() TestTarget target(2);. TestTarget(int hoge) から TestTarget(int hoge, int fuga) に変更 Int fuga に応じて複雑な処理を

変更に対処する [1] Parallel Change Class TestTarget void TestTarget(int hoge). void TestTarget(int hoge, int fuga) 新旧共存で TDD 逐次テストを置き換えていく TEST() TestTarget target(0, 0); TEST() TestTarget target(1); TEST() TestTarget target(2);. TestTarget(int hoge) から TestTarget(int hoge, int fuga) に変更 Int fuga に応じて複雑な処理を

変更に対処する [2] TDD のための事前変更 Class TestTarget void TestTarget(int hoge, int fuga). Dummy で置き換えつつインターフェースを変更その後 TDD TEST() TestTarget target(0, 0); TEST() TestTarget target(1, 0); TEST() TestTarget target(2, 0);. TestTarget(int hoge) から TestTarget(int hoge, int fuga) に変更 Int fuga に応じて複雑な処理を

変更に対処する 無理のない小さなステップで 効率よく変更できるように考える 事前対策 Pallalel Change や前倒しのインターフェース変更等 テストの保護を壊さない変更にもテストで戦う

学習のネクストステップ TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

TDD を学ぶ TDDは文献 情報発信源 コミュニティから学ぶことができます TDDはシンプルな開発手法ですが 様々な関連分野 応用分野とリンクしているため 勉強の余地を大いに持っています

基礎を身につける TDD 実践のネクストステップ テストを 整える 変更に 備える 変更を 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

基礎を身につける @t_wada Id:t-wada

より活用する TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

より活用する テスト設計

より活用する テストコードの実装 xutp magagine ぺけま Coming soon! xunit Test Patterns 読書会 Wiki http://www.fieldnotes.jp/xutp/ Id:setoazusa @setoazusa

より活用する 変更への対処

応用分野を学ぶ TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ

応用分野を学ぶ テストの活用 TDD WACATE( もうすぐ募集開始!) http://wacate.jp/ Testing Engineer's Forum http://www.swtest.jp/wiki/index.php?swte st.jp/wiki/forum

応用分野を学ぶ DVCS TDD Id:bleis-tift @bleis SCM Boot camp http://d.hatena.ne.jp/kyon_mm/archive?word=*%5bscmbc%5d Id:kyon_mm @kyon_mm Id:pocketberserker @pocketberserker

応用分野を学ぶ BDD/Outside-In TDD Growing Object-Oriented Software, Guided by Tests(goos) 読書会 http://devtesting.jp/goos/ Id:setoazusa @setoazusa

その他 TDDBC 運営コミュニティ TDDBC http://devtesting.jp/tddbc/

ご清聴ありがとうございました TDD 実践のネクストステップ テストを 整える 変更に 備える 変更に 対処する TDD 学習のネクストステップ 基礎を 身につける より 活用する 応用分野 を学ぶ