実践JUnit
xUnitTestPatternsから学ぶユニットテスト


   2012.06.16 OSC 2012 北海道
   Shuji Watanabe (@shuji_w6e)




                                 1
本日の内容
本日の内容

    ユニットテストの目的
本日の内容

    ユニットテストの目的

ユニットテストの実践
本日の内容

    ユニットテストの目的

ユニットテストの実践

    ユニットテストの問題
SHUJI Watanabe
Java デベロッパー

 要件定義からテストまで全領域対応

Blog「やさしいデスマーチ」

札幌Javaコミュニティ

Java, Groovy, JavaFX, MongoDB

TDD, ユースケース駆動開発, テスト
WEB+DB PRESS vol.69
JUnit実践入門

 カスタムMatcher

 パラメータ化テスト

 テストの構造化

 カスタムRule

 Cucumebr-junit
XUnit Test Patterns
 http://xunitpatterns.com/

 Webで読めます(英語)
ユニットテストの目的
テストが
                                      必要なワケ




http://www.flickr.com/photos/essecento/4297955162/
スキル不足
仕様変更


                                     経験不足
複雑な要件

                                                   不安
   http://www.flickr.com/photos/yopse/3772030400/
不完全な人間




   http://www.flickr.com/photos/sharynmorrow/3948100/
ユニットテストとは?
ソフトウェアを構成する最小部品のテスト

主にクラスやメソッドが対象

対象が期待される振る舞いをするかを検証
テストの4象限モデル
                ビジネス面
                                   手動


            機能テスト      受け入れテスト




                                   製品を批評
 チームを支援




          ストーリーテスト    ユーザビリティテスト




                        負荷テスト
          ユニットテスト     パフォーマンステスト



 自動
                    技術面
テストの4象限モデル
                ビジネス面
                                   手動


            機能テスト      受け入れテスト




                                   製品を批評
 チームを支援




          ストーリーテスト    ユーザビリティテスト




                        負荷テスト
          ユニットテスト     パフォーマンステスト



 自動
                    技術面
テストの4象限モデル
                ビジネス面
                                   手動


            機能テスト      受け入れテスト




                                   製品を批評
 チームを支援




          ストーリーテスト    ユーザビリティテスト




                        負荷テスト
          ユニットテスト     パフォーマンステスト



 自動
                    技術面
チームを支援するテスト
自分のコードへの自信

積極的なリファクタリング

安心できるリリース
技術面のテスト
プログラマが行う

プロダクションコードの作成を支援する

ビジネス的価値 < 技術的負債の低減
ユニットテストの特徴
プログラマが行い、

開発チームを支援し、

技術面に属し、

自動化が可能。
セーフティネット




   http://www.flickr.com/photos/32010000@N08/2987901256/
JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト
品質とユニットテスト
ユニットテストで直接の品質はあがらない

品質を高めるにはビジネス面のテストが必要

要件を満たしているか?(受け入れテスト)

使いやすいか?(ユーザビリティテスト)

ユニットテストにより技術的負債が減る

変化や追加要求に強くなる
ユニットテストの実践
テストケースとは?
テスト対象(sut: System Under Test)に
特定の操作を行い、
実測値(Actual Value)が
期待値(Expected Value)となることを
検証(Verify)する
テストデータのサンプリング
「完璧なテスト」はできない

少ない入力値で効率良くテストを行う

様々なテスト技法

境界値分析

同値クラス

ペア構成テスト
テストケースの条件
再現性がある

曖昧さがない

自動化されたテスト(Automated Test)
4フェイズ テスト
初期化処理(SetUp)

実行(Exercise)    @Test
                public void test() {
検証(Verify)        // SetUp
                  // Exercise
後処理(TearDown)     // Verify
                  // TearDown
                }
アサーション
 アサーションとは「こうなる」という表明
assertThat(actual, is(expected));

  static importされたメソッド

  自然言語風の記述
  assert that actual is expected
  変数名(actual, expected)
Matcher API
 JUnit4の機能

 一致する条件を定義したオブジェクト
assertThat(actual, is(expected));

  isはIsオブジェクトを返す

  Isはequalsを使った一致を行うMatcher

  他にも多くのMatcherがある
リファクタリング
ユニットテストの主目的はリファクタリング

技術的負債を蓄積させない

安心してプロダクションコードを修正できる

内部実装に依存するテストは避けること
ユニットテストと設計
ユニットテストはサンプルコード

自分が最初のユーザー(Eat your own dog food)

APIが使いやすいかをテストする

テストできないAPIは再設計する
例)計算機クラス
public class Calculator {

    // 割り算を行うメソッド
    public int divide(int x, int y) {
      return x / y;
    }
}
例)テストコード
@Test
public void test() {
  // SetUp
  Calculator sut = new Calculator();
  float expected = 1.5;
  // Exercise
  float actual = sut.divide(6, 4);
  // Verify
  assertThat(actual, is(expected));
}
例)APIの設計ミス
public class Calculator {

    // 割り算を行うメソッド
    public float divide(float x, float y) {
      return x / y;
    }
}
API設計とユニットテスト
テストコードでAPI設計を検証出来る

 期待値が検証出来ないAPI

 使いにくい/解りにくいAPI

テストコードを意識してAPIを設計する

突き詰めるとテスト駆動開発(TDD)

 テストを先に書く(テストファースト)
TDDのサイクル
                            1.設計する
5.リファクタリング



               Heuristics




                               2.テストを書く



 4.テストを成功させる

                        3.コードを書く
ドキュメントとしてのテスト
テストコードは動作するドキュメント

具体的なサンプルコード

具体的な入力値と期待値

テスト成功による保証

JavaDocや仕様書より正確なドキュメント
ユニットテストの問題
不安定なテスト
テスト結果が不定

ランダム性やシステム時間に依存したテスト

環境に依存したテスト

テスト結果が一定でないと信頼できない

オオカミ少年問題

常にすべてのテストが成功することを維持
脆いテスト
少しの変更で多くのテストに影響する

疎結合になっていない

データの影響範囲が大きい

インターフェイス(API)の設計が甘い

いずれもテストのメンテナンスコストを増大
増えるテストコード
重複

DRY原則(Don t Repeat Yourself)

やり過ぎると可読性が落ちる

テストはテストケースで独立すべき

ネストしたクラスの利用(Enclosed)

パラメータ化テスト
Enclosedテストクラス
 テストクラスの構造化

 テストをコンテキスト(文脈)で整理
@RunWiht(Enclosed.class)
public void ArrayListTest {
  public static class 初期状態のとき {
    @Test public void test() {}
  }
  public static class 要素が1つのとき {
    @Test public void test() {}
  }
}
Enclosedテストクラス
 テストクラスの構造化

 テストをコンテキスト(文脈)で整理
@RunWiht(Enclosed.class)
public void ArrayListTest {
  public static class 初期状態のとき {
    @Test public void test() {}
  }
  public static class 要素が1つのとき {
    @Test public void test() {}
  }
}
パラメータ化テスト
 テストデータとテストメソッドを分離

@RunWiht(Theories.class)
public void CalculatorTest {
  @DataPoints public static Param[] PARAMS = {
        new Param(3, 4, 12), new Param(1, 5, 5), ....
  };
  @Theory public void divideのテスト(Param p) {
     //
  }
}
パラメータ化テスト
 テストデータとテストメソッドを分離

@RunWiht(Theories.class)
public void CalculatorTest {
  @DataPoints public static Param[] PARAMS = {
        new Param(3, 4, 12), new Param(1, 5, 5), ....
  };
  @Theory public void divideのテスト(Param p) {
     //
  }
}
詳しくはWEB+DB vol.69で
JUnit実践入門

 カスタムMatcher

 パラメータ化テスト

 テストの構造化

 カスタムRule

 Cucumebr-junit
テストしにくいオブジェクト
システム時間や外部API

モックやスタブの活用

多用は禁物

内部実装に依存しないように注意して使う

mockito, EasyMock
まとめ
ユニットテストを学ぼう
目的は開発の支援

基本となる「型」を習得(4フェイズテスト)

テスト技法を学び効率良くサンプリング

パターンを学ぶ

API設計とテストは密な関係(TDD)

テスティングフレームワークを活用する
ユニットテストを超えて...
継続的インテグレーション(テスト)

テストによる実行網羅率(カバレッジ)

テスト駆動開発

自動化された受け入れテスト

振る舞い駆動開発

探索的テスト
おしまい

More Related Content

PPTX
MVVM入門
PDF
ConvNetの歴史とResNet亜種、ベストプラクティス
PDF
Adversarial Examples 分野の動向 (敵対的サンプル発表資料)
PDF
ソフトウェア工学2023 02 上流工程
PDF
MySQLで論理削除と正しく付き合う方法
PPTX
【論文読み会】MAUVE: Measuring the Gap Between Neural Text and Human Text using Dive...
PDF
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
PDF
【DL輪読会】Hierarchical Text-Conditional Image Generation with CLIP Latents
MVVM入門
ConvNetの歴史とResNet亜種、ベストプラクティス
Adversarial Examples 分野の動向 (敵対的サンプル発表資料)
ソフトウェア工学2023 02 上流工程
MySQLで論理削除と正しく付き合う方法
【論文読み会】MAUVE: Measuring the Gap Between Neural Text and Human Text using Dive...
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
【DL輪読会】Hierarchical Text-Conditional Image Generation with CLIP Latents

What's hot (20)

PDF
Adversarial Examples 分野の動向(メタサーベイ追加版)
PPTX
【論文読み会】Autoregressive Diffusion Models.pptx
PDF
私にとってのテスト
PDF
「解説資料」Toward Fast and Stabilized GAN Training for High-fidelity Few-shot Imag...
PDF
DockerとDocker Hubの操作と概念
PPTX
概念モデリング再入門 + DDD
PDF
分散トレーシング技術について(Open tracingやjaeger)
PDF
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
PDF
動画認識・キャプショニングの潮流 (CVPR 2018 完全読破チャレンジ報告会)
PDF
Game Development on AWS (ゲーム開発環境を向上させるためのAWS活用術)
PPTX
Learning to summarize from human feedback
PDF
Test Yourself - テストを書くと何がどう変わるか
PPTX
視覚と対話の融合研究
PDF
イミュータブルデータモデル(入門編)
PDF
[DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
PPTX
G社のNMT論文を読んでみた
PDF
20180305_ppl2018_演繹から帰納へ~新しいシステム開発パラダイム~
PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
PPTX
C# 8.0 null許容参照型
PDF
deep dive distributed tracing
Adversarial Examples 分野の動向(メタサーベイ追加版)
【論文読み会】Autoregressive Diffusion Models.pptx
私にとってのテスト
「解説資料」Toward Fast and Stabilized GAN Training for High-fidelity Few-shot Imag...
DockerとDocker Hubの操作と概念
概念モデリング再入門 + DDD
分散トレーシング技術について(Open tracingやjaeger)
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
動画認識・キャプショニングの潮流 (CVPR 2018 完全読破チャレンジ報告会)
Game Development on AWS (ゲーム開発環境を向上させるためのAWS活用術)
Learning to summarize from human feedback
Test Yourself - テストを書くと何がどう変わるか
視覚と対話の融合研究
イミュータブルデータモデル(入門編)
[DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
G社のNMT論文を読んでみた
20180305_ppl2018_演繹から帰納へ~新しいシステム開発パラダイム~
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
C# 8.0 null許容参照型
deep dive distributed tracing
Ad

Viewers also liked (16)

PDF
モックライブラリを使ってきちんとユニットテストする #Objective-C
PDF
第4回勉強会 単体テストのすすめ
PPTX
Team Foundation Server 2015 Update 2.1 アップグレード 手順書 ~ Team Foundation Server 2...
PPTX
Team Foundation Server 2015 Update 1 インストール 手順書
PDF
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
PDF
SSMでマネージドEC2 #reinvent #cmdevio
PPTX
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
PPTX
もう怖くない! Team Foundation Server 2015 Update 1 ワークアイテム管理と テンプレートのカスタマイズ 概要
PDF
テスト駆動開発のはじめ方
PPTX
Test Manager + Team Foundation Server /Visual Studio Team Services 手順書(共有パラメー...
PPTX
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
PPTX
Team Foundation Server / Visual Studio Team Services 手順書
PPTX
Visual Studio 2017 と Team Foundation Server / Visual Studio Team Services で実現...
PPTX
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
PDF
Nds#24 単体テスト
PPTX
Team Foundation Server 2015 による テスト工数削減
モックライブラリを使ってきちんとユニットテストする #Objective-C
第4回勉強会 単体テストのすすめ
Team Foundation Server 2015 Update 2.1 アップグレード 手順書 ~ Team Foundation Server 2...
Team Foundation Server 2015 Update 1 インストール 手順書
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
SSMでマネージドEC2 #reinvent #cmdevio
iOSテスト自動化勉強会 -やはり俺達の回帰テストは間違っている-
もう怖くない! Team Foundation Server 2015 Update 1 ワークアイテム管理と テンプレートのカスタマイズ 概要
テスト駆動開発のはじめ方
Test Manager + Team Foundation Server /Visual Studio Team Services 手順書(共有パラメー...
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
Team Foundation Server / Visual Studio Team Services 手順書
Visual Studio 2017 と Team Foundation Server / Visual Studio Team Services で実現...
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
Nds#24 単体テスト
Team Foundation Server 2015 による テスト工数削減
Ad

Similar to JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト (20)

KEY
テストコードのリファクタリング
PDF
SGT2013 技術トークス「アジャイルテスティング」
PDF
アジャイル×テスト開発を考える
PDF
ワンクリックデプロイ101 #ocdeploy
KEY
テストとの上手な付き合い方
KEY
テスト初心者Androiderのためのソフトウェアテスト入門
PDF
ぼくのかんがえた iOSテスト戦略
PPTX
Continuous delivery chapter4
PDF
アジャイルテスト -高品質を追求するアジャイルチームにおけるテストの視点-
PPTX
【システムテスト自動化カンファレンス2013 LT】 Data Driven Development (仮)
PDF
アジャイルテストを、壮絶に、考える。
PDF
テストを分類してみよう!
PDF
Jenkins ユーザ・カンファレンス 2012 東京 S406-4/マルチステージ型継続的インテグレーションのすすめ
PDF
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
PDF
PDF
Gui自動テストツール基本
PPT
自動テスト知識体系TABOKのご紹介
PPTX
TABOK Skill Category2解説
PPTX
JaSST'16 Tokyo モバイルセッション
PDF
はこだてIKA 第4回勉強会 単体テスト
テストコードのリファクタリング
SGT2013 技術トークス「アジャイルテスティング」
アジャイル×テスト開発を考える
ワンクリックデプロイ101 #ocdeploy
テストとの上手な付き合い方
テスト初心者Androiderのためのソフトウェアテスト入門
ぼくのかんがえた iOSテスト戦略
Continuous delivery chapter4
アジャイルテスト -高品質を追求するアジャイルチームにおけるテストの視点-
【システムテスト自動化カンファレンス2013 LT】 Data Driven Development (仮)
アジャイルテストを、壮絶に、考える。
テストを分類してみよう!
Jenkins ユーザ・カンファレンス 2012 東京 S406-4/マルチステージ型継続的インテグレーションのすすめ
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Gui自動テストツール基本
自動テスト知識体系TABOKのご紹介
TABOK Skill Category2解説
JaSST'16 Tokyo モバイルセッション
はこだてIKA 第4回勉強会 単体テスト

More from Shuji Watanabe (20)

PDF
Serverless - Developers.IO 2019
PDF
Ansible ハンズオン on AWS - DevelopersIO 2017
PDF
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
PPTX
ELBの概要と勘所
PPTX
AWSによるWebサイト構築と運用 - concrete5 編 -
PDF
Cloud FormationによるBlue-Green Deployment - Dev io mtup11 003
PDF
CloudSearchによる全文検索 - CM:道 2014/08/01
PDF
Javaアプリケーション開発におけるユニットテストとTDDの実践 Java Day Tokyo 2014
PDF
TDD BootCamp in JJUG CCC - レガシーコード対策編 -
PDF
s3+cloud frontによる静的コンテンツ配信 - Sphinx編 #cmdevio
PDF
クラスメソッド会社説明会in札幌 — メンバー紹介 #cmdevio
PDF
テスト駆動開発へようこそ
PDF
ユースケースからテスト駆動開発へ
KEY
テスト駆動開発入門
KEY
テスト駆動開発の導入ーペアプログラミングの学習効果ー
KEY
アジャイルテスティング
PDF
テストリストの見つけ方
PDF
TDDをはじめよう
KEY
Jenkins導入事例
KEY
ソフトウェア開発の3本柱
Serverless - Developers.IO 2019
Ansible ハンズオン on AWS - DevelopersIO 2017
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
ELBの概要と勘所
AWSによるWebサイト構築と運用 - concrete5 編 -
Cloud FormationによるBlue-Green Deployment - Dev io mtup11 003
CloudSearchによる全文検索 - CM:道 2014/08/01
Javaアプリケーション開発におけるユニットテストとTDDの実践 Java Day Tokyo 2014
TDD BootCamp in JJUG CCC - レガシーコード対策編 -
s3+cloud frontによる静的コンテンツ配信 - Sphinx編 #cmdevio
クラスメソッド会社説明会in札幌 — メンバー紹介 #cmdevio
テスト駆動開発へようこそ
ユースケースからテスト駆動開発へ
テスト駆動開発入門
テスト駆動開発の導入ーペアプログラミングの学習効果ー
アジャイルテスティング
テストリストの見つけ方
TDDをはじめよう
Jenkins導入事例
ソフトウェア開発の3本柱

Recently uploaded (11)

PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
PDF
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
Working as an OSS Developer at Ruby Association Activity Report 2025
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純)
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Working as an OSS Developer at Ruby Association Activity Report 2025

JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト

Editor's Notes