Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テストの活用による開発効率化/Accelerate Software Development by Test

テストの活用による開発効率化/Accelerate Software Development by Test

Hiroki Iseri

August 06, 2011
Tweet

More Decks by Hiroki Iseri

Other Decks in Programming

Transcript

  1. TEST_F(TestMacroWord, test_macroData_macroWord_bug21) { MacroData macroData; macroData.push_back("AUTO_DEBUG_1"); macroData.push_back("AUTO_DEBUG_2"); macroData.push_back("AUTO_DEBUG_2"); macroData.push_back("AUTO_DEBUG_2"); macroData.push_back(“BB_H_");

    MacroWord macroWord(macroData); EXPECT_EQ("AUTO_DEBUG_1", macroWord.data_[0].macroName_); EXPECT_EQ(1, analyzer.data_[0].number); EXPECT_EQ("AUTO_DEBUG_2", macroWord.data_[1].macroName_) EXPECT_EQ(3, analyzer.data_[1].number); EXPECT_EQ(“BB_H_", macroWord.data_[2].macroName_); EXPECT_EQ(1, analyzer.data_[2].number); } class MacroWord 1. 自動テスト上でバグを再現する
  2. TEST_F(TestMacroWord, test_macroData_macroWord__bug21) { MacroData macroData; macroData.push_back("AUTO_DEBUG_2"); macroData.push_back("AUTO_DEBUG_2"); macroData.push_back("AUTO_DEBUG_2"); MacroWordProxy::wordCount(macroData); EXPECT_EQ(3,

    MacroWordProxy::getSize(0)); } class MacroWord 1. テスト上でバグを再現する 2. テストでバグを絞込み特定する 3. 修正後テストがパスすることを確認。テストはCIへ バグを再現 バグを特定 バグ修正のチェック
  3. boost::xpressive TEST(regex, test_regex_fileseek) { namespace xp = boost::xpressive; string target;

    xp::smatch match; xp::sregex rex = xp::sregex::compile ("(¥¥.c|¥¥.h)$"); target = "test"; EXPECT_EQ(false, xp::regex_search(target, match, rex)); target = "test.c"; EXPECT_EQ(true, xp::regex_search(target, match, rex)); target = "test.h"; EXPECT_EQ(true, xp::regex_search(target, match, rex)); target = "./../source/_svn/text-base/main.c.svn-base"; EXPECT_EQ(false, xp::regex_search(target, match, rex)); target = "test.cpp"; EXPECT_EQ(false, xp::regex_search(target, match, rex)); } 動作チェック 用例ドキュメントとして活用 テストで動作を確認する。不安がなくなるまで試す
  4.  コードの追加  リファクタリング  コードの保守  コードの解析  デバッグ

     バグの早期検出  ユニットレベルでのバグ検出  進捗管理  ・・・ TDD 仕様化 テスト 学習テスト 探索的 テスト 活用は加速度的に広がる BDD Cover & Modify リファクタリング でのテスト デバッギン グテスト ATDD ストーリ駆動 テストファーストによる設計 Test as Documentation
  5.  CI  自動テストの実行、管理、保守の要  今や導入当たり前の最低限の開発インフラ  クロス環境対応の自動テスト環境  ユニットテスト/UIベーステスト/エミュレータテスト/実機テスト

     Git/DVCS  柔軟なブランチ戦略によるテストのサポート  各種運用サポート  カバレッジ監視、実行監視、テスト実装の各種メトリクス テストインフラ・テスト側
  6.  Jenkins CI×Monkey Runner/Junit/Robotium等  CIのテストの効果  継続的なテストの実施  テストのビルド・実行チェック

     サーバサイドのテスト環境の活用効率確保  テストの品質指標の継続評価 CIへの自動テストの組み込み
  7.  テスト時に製品用コード/テスト用コードの切替を実現す る構造/IF  Dependency Injection/Dependency Lookup  DIコンテナ, Constructor

    Injection,…  プリプロセッサ/Class path設定  テストの障害を排除できる/テスト容易性を注入できる 接合部(Seam) テスト 対象 テスト コード 製品用 コード テスト用 コード Seam
  8.  適切なインターフェース設計  型による条件の削減  適切な並行処理設計  データ共有部分の最小化・適切なロック、排他処理や保護  副作用の削減

     メモリ保護や処理系依存・未定義の回避  防御的プログラミング、契約による設計/契約プログラミング  サニティチェック機能 テストすべきテスト条件を 削減する機構
  9.  可読性やDRYをはじめとした保守性の改善  接合部の確保  高リスクコードの分離・ラッピング テストコードの実装の保守性・ 堅牢性を高める @Test Public

    void test_1() { Int a; … } @Test Public void test_無効なIDを 指定すると例外を返す() { Int dummyID; … } @Test Public void test_hoge() { …コピペコード… … } @Test Public void test_fuga() { …コピペコード… … } Private void 共通メソッド() { …コピペコード… } @Test Public void test_hoge() { 共通メソッド() … } @Test Public void test_fuga() { 共通メソッド() … }
  10.  テスト設計の品質確保には、適切なテスト分析・テスト 設計が必要  テスト分析  対象の調査・分析  テストの要求・制約の分析 

    テスト観点、テスト条件の識別と整理  テスト設計  テストのタイプ/サイクルの設計  テストスイート・テストケースの設計 テスト設計の保守性・堅牢性 を高める
  11.  Ex)Test Doubleの運用  テスト対象の分析  対象の調査  テスト環境の明確化 

    テスト容易性に劣るコンポーネントの抽出  Seamの実装状況  観測点/制御点の分析  テスト条件の抽出  テスト環境の抽出  トレードオフの品質の分析とすり合わせ  観測点/制御点の分析  観点の整理  Test Double使用/未使用時のテスト切り分け テスト分析・テスト設計の工夫
  12. テストプロセスの実施 開発計画 テスト計画 要求分析 設計・実装・作りこみ テスト インフラ テスト分析 開発工程内テストの 設計・実装・実施・作りこみ

    テスト インフラ システムテストの設計 相互フィードバック 相互フィードバック 製品側 開発プロセス テスト プロセス