組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

19
組み込み開発での システムテスト自動化の 一つの考え方 井芹 洋輝(STAR) システムテスト自動化カンファレンス2013 2013/12/1 @オラクル青山センター

description

STAC2013/Lightning Automated Testing Demo

Transcript of 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

Page 1: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  システムテスト自動化の  

一つの考え方

井芹 洋輝(STAR)  システムテスト自動化カンファレンス2013  

2013/12/1  @オラクル青山センター  

Page 2: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

今回の発表について

•  組み込み開発での上位テストの自動化の考え方の一例を紹介します  

•  伝えたいこと  – 組み込み開発ではシステムテスト・統合テストのテスト自動化は重要です  

– それらのテスト自動化ではテストレベルに閉じこまらず、責務や負荷を分散しましょう  

•  自己紹介  – 組み込み開発・テストのコンサル・エンジニア  STAR、WACATE実行委員、TDDBC所属等  

– 最近は車載のテスト自動化やシステムテスト支援に従事  

Page 3: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  システムテストの実行自動化は有効です

自動化による回帰テストの効率化

テスト条件の  スケーラビリティの向上  (組み合わせや  タイミング)

制御や観測の選択肢の拡充

ありがちな  組み込み開発の制約  

テスト自動化の活用の余地

リアルタイム性要求  複雑なタイミング設計

現実世界との物理的なインターフェース

頻繁に変わる実行環境  ソフトウェア以外の影響の高さ

内部観測性の低さ

タイミング依存・順序依存のバグ

環境起因のデグレード  ハードウェアのバグ

検出しにくい内部バグ

ありがちな  テストで対応すべき課題  

Page 4: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  システムテストの実行自動化は有効です

自動化による回帰テストの効率化

テスト条件の  スケーラビリティの向上  (組み合わせや  タイミング)

制御や観測の選択肢の拡充

ありがちな  組み込み開発の制約  

テスト自動化の活用の余地

リアルタイム性要求  複雑なタイミング設計

現実世界との物理的なインターフェース

頻繁に変わる実行環境  ソフトウェア以外の影響の高さ

内部観測性の低さ

タイミング依存・順序依存のバグ

環境起因のデグレード  ハードウェアのバグ

検出しにくい内部バグ

ありがちな  テストで対応すべき課題  

組み合わせや、実施タイミング・同時処理の条件パターンなどを増やして、タイミング依存バグを網羅的

にカバー

ハードウェアや構成変更時  の軽快なチェック  

内部観測性の補強  自動化の幅を広げる  

Page 5: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込みでの  システムテストの実行自動化

種類 手段

外部インターフェースを介した自動化

・操作ロボット  ・外部の冶具ツール  ・画像・映像解析

評価環境を用いた自動化 ・評価ボード上での実行  ・OSやフレームワークの組み換え

仮想・半仮想環境による自動化

・エミュレータやその他シミュレーションツール、ICEでの自動化

コンポーネントの置換やテスト用機能の組み込み

・MockオブジェクトやFakeオブジェクトの導入  ・自動操作機能、自己検証機能などの組み込み  

●全体の傾向として    コストや手間がかかる/環境や条件にカスタマイズが必要/    本番環境と異なる/完全自動化が難しい場合が多い  

一般的な手段の例:

Page 6: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

システムテスト実行自動化では、テストの責務と負荷の分散・軽減を推進しましょう  

•  システムテストに閉じず、本来の品質やテストの目的に立ち戻って制約に対応しましょう  

•  テストや環境面は多方面で育て、多方面で活用しましょう  – コストパフォーマンスや恩恵が高まって、大きな効果を得られるようになります  

Page 7: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テストの責務を分散しましょう

•  システムテストに制約がある場合、そもそもテストの目的に立ち戻りましょう  

•  統合テストや、半自動化、その他品質確認手段でしばしばサポートできます  

品質エンジニアリング

品質の目標や要求

テスト要求

テスト目的

テスト

システムがフリーズしないこと:  機能Aでメモリリークがないこと

機能Aの想定される実行領域で  メモリリークが発生しないこと

機能Aの想定条件化でメモリリークが発生しないことを確認する

ロボットでのロングランテスト

Page 8: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テストの責務を分散しましょう

•  システムテストに制約がある場合、そもそもテストの目的に立ち戻りましょう  

•  統合テストや、半自動化、その他品質確認手段でしばしばサポートできます  

品質エンジニアリング

品質の目標や要求

テスト要求

テスト目的

テスト

システムがフリーズしないこと:  機能Aでメモリリークがないこと

機能Aの想定される実行領域で  メモリリークが発生しないこと

機能Aの想定条件化でメモリリークが発生しないことを確認する

Valgrind+gcov+テストインプット生成コンポーネントによる自動結合

テスト

ロボットでのロングランテスト

Page 9: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テストの責務を分散しましょう

•  システムテストに制約がある場合、そもそもテストの目的に立ち戻りましょう  

•  統合テストや、半自動化、その他品質確認手段でしばしばサポートできます  

品質エンジニアリング

品質の目標や要求

テスト要求

テスト目的

テスト

システムがフリーズしないこと:  機能Aでメモリリークがないこと

機能Aの想定される実行領域で  メモリリークが発生しないこと

機能Aの想定条件化でメモリリークが発生しないことを確認する

Valgrind+gcov+テストインプット生成コンポーネントによる自動結合

テスト

ロボットでのロングランテスト

網羅的な  バグ出し

最終チェック  

コストパフォーマンスや  バグ検出力の工場

Page 10: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テスト自動化の負荷を分散しましょう

•  開発ライフサイクルを多方面に支えるインフラを構築しましょう  

•  自動化のためのテスタビリティを前倒しで確保していきましょう  

●上位テストの実行自動化インフラ  ・観測点/制御点インターフェース   ログ出力、接合部、Dependency  InjecIon、Dependency  Lookup、JTAG等・・  ・テスト用内部コンポーネント   テストデータ生成機能、自己チェック機能、自動操作機能等・・  ・Test  Double   Test  Stub、Fakeオブジェクト、Mockオブジェクトなど等・・  ・外部コンポーネント   評価ボード、操作ロボット、デバッガ、ICE等・・    

Page 11: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テスト自動化の負荷を分散しましょう

•  開発ライフサイクルを多方面に支えるインフラを構築しましょう  

•  自動化のためのテスタビリティを前倒しで確保していきましょう  

●上位テストの実行自動化インフラ  ・観測点/制御点インターフェース   ログ出力、接合部、Dependency  InjecIon、Dependency  Lookup、JTAG等・・  ・テスト用内部コンポーネント   テストデータ生成機能、自己チェック機能、自動操作機能等・・  ・Test  Double   Test  Stub、Fakeオブジェクト、Mockオブジェクトなど等・・  ・外部コンポーネント   評価ボード、操作ロボット、デバッガ、ICE等・・    

開発者テスト・  ユニットテスト・統合テストと共有して活

用可能

製品開発の中で  開発可能

Page 12: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テスト自動化の負荷を分散しましょう

•  例)自動化されたユニットテストの用途  – 開発中のCIでのテスト  • 変更やリファクタリングの支援  • バグ混入の即時検出  • テストの保守  

– 統合テストでの自動化手段  • テストコードやテスト用コンポーネントの流用  • 作りこまれたテスタビリティやテスト機能の活用  

– システムテストでの自動化手段  • 作りこまれたテスタビリティやテスト機能の活用  

Page 13: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テスト自動化の負荷を分散しましょう

•  例)自動化されたユニットテストの用途  – 開発中のCIでのテスト  • 変更やリファクタリングの支援  • バグ混入の即時検出  • テストの保守  

– 統合テストでの自動化手段  • テストコードやテスト用コンポーネントの流用  • 作りこまれたテスタビリティやテスト機能の活用  

– システムテストでの自動化手段  • 作りこまれたテスタビリティやテスト機能の活用  

多方面で構築でき多方面で活用できる  コストパフォーマンスやテストの効果が増大し、  

選択肢が広がる  

Page 14: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

テストの負荷と責務の分散を支える

開発 ユニットテスト  ・統合テスト  工程  

システムテスト工程  

TDDによるユニットテスト・テスタビリティの構築

CIによるテスト環境の維持

テストの整理

テストコード・  テストのインフラ

システムテストの担保

テストのインフラ・

テストの実施

自動化実現のインフラや制約の抽出

●全体の目的や方針に対応するアプローチや手法をとる    全体テスト分析・計画の充実/テスト上流設計の整備/リスクマネジメント等の独立プロセス等  ●全体を支えるインフラを構築する    CI/汎用的なTest  Double/フレームワーク等  

Page 15: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

デモ

Page 16: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  継続的な自動テストの実行

•  簡易的ですが、ホスト・ターゲットテストを継続運用するテスト環境を紹介します  

Page 17: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  継続的な自動テストの実行

•  構成  

開発環境  (CppUTest)

CI  (Jenkins)

Repository  

ターゲット  環境  

(Arduino)

Hostのテスト環境  

(CppUTest)

ターゲットでのテスト

ホストでのテスト

ホスト  でのテスト  (個人レベル)

ターゲットマネージャ  

(独自スクリプト+uno)  

ロード・実行

Junit形式  テスト  レポート

ログ取得 生成

push

CIサーバ

Page 18: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  継続的な自動テストの実行

ホスト向けコード

ターゲット向けコード

Link  Seam

テストモジュール  

本体モジュール

ソフトウェア機能として組み込み

Page 19: 組み込み開発でのシステムテスト自動化の一つの考え方(STAC)

組み込み開発での  継続的な自動テストの実行

•  構成  

開発環境  (CppUTest)

CI  (Jenkins)

Repository  

ターゲット  環境  

(Arduino)

Hostのテスト環境  

(CppUTest) TDDを中心にプログラミング中にテストを構築  

ターゲットマネージャ  

(独自スクリプト+uno)  

ロード・実行

Junit形式  テスト  レポート

ログ取得 生成

push

イテレーションごとなど定期的なタイミングでテストをまとめあげ  

ホスト上のテストと実機上のテストを継続実行  

実機へのロードと実行結果の受

信  

たまった資産を  規模の大きい統合テストやシステムテストで活用