ライブラリのバージョン更新支援のための実行トレースからのテストケース生成

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

OWL-Sを用いたWebアプリケーションの検査と生成
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
.NET テクノロジー を利用した SAP ソリューションの拡張 (3階層化) (評価環境構築ガイド)
表計算ソフトで動作するNEMUROの開発
データマイニングのための柔軟なデータ取得、操作を支援するAPIの設計
輪講第二回 守川学.
デバイスからの異常注入が指定可能なCPUエミュレータ
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
ソフトウェアリポジトリにおける コードクローン作成者・利用者関係分析手法とその適用
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
大阪大学 大学院情報科学研究科 博士前期課程2年 宮原研究室 土居 聡
オブジェクト指向プログラムのための 動的結合メトリクスの評価
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
動的スライスを用いた バグ修正前後の実行系列の比較
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
社会シミュレーションのための モデル作成環境
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ハッシュ値比較による Javaバイトコードに含まれる ライブラリの検出手法
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム実行に対するフェイズ検出を用いた ログ取得量の動的変更手法の提案
Parallel Setsによるライブラリの 組み合わせと利用状況の可視化
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
Java における 先進的リフレクション技術
dcNavi: デバッグ方法をアドバイス する関心事指向リポジトリナビゲータ
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
ソフトウェアプロダクト集合に対する 派生関係木の構築
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
dcNavi:デバッグ支援のための グラフベース推薦システム
「マイグレーションを支援する分散集合オブジェクト」
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラム分散化のための アスペクト指向言語
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
ベイジアンネットワークと クラスタリング手法を用いたWeb障害検知システムの開発
Detecting Software Modularity Violations
Presentation transcript:

ライブラリのバージョン更新支援のための実行トレースからのテストケース生成 〇嶋利一真1 石尾隆2 井上克郎1 1大阪大学 2奈良先端科学技術大学院大学

ライブラリは近年のソフトウェア開発において必要不可欠 ライブラリとは  汎用性の高い複数のプログラムを再利用可能な形で  ひとまとまりにしたもの ライブラリは近年のソフトウェア開発において必要不可欠 ただ,ライブラリを使う上で問題がある.

ライブラリ更新 ライブラリの更新は頻繁に行われる[1] ライブラリの更新の内容は機能追加,バグ修正など 若いライブラリは~3か月1回,成熟したものは1年~で1回 ライブラリの更新の内容は機能追加,バグ修正など 更新を行わなければ脆弱性の問題の影響を受けることも… しかし、ライブラリの更新に消極的な開発者もいる 若いライブラリ(~10年未満),成熟したライブラリ(10年以上~) [1] Akinori Ihara and Daiki Fujibayashi, Hirohiko Suwa and Raula Gaikovina Kula and Kenichi Matsumoto: Understanding When to Adapt a Library: A Case Study on ASF Projects :OSS 2017

ライブラリ更新における問題 新しいバージョン出てる!アップデートしよう! 動かなくなった! ダウングレードして元に戻そう…   新しいバージョン出てる!アップデートしよう!   動かなくなった!   ダウングレードして元に戻そう…    Build success    Build failure Q. Java はライブラリ

ライブラリ更新における問題 新しいバージョン出てる!アップデートしよう! 動かなくなった!!!! ダウングレードして元に戻そう…   新しいバージョン出てる!アップデートしよう!   動かなくなった!!!!   ダウングレードして元に戻そう…    Build success    Build failure Java SE8とJava SE7の非互換性(一部抜粋) 『Java SE 8では、TypeVariableのjavax.lang….の 戻り値が以前のリリースの戻り値とは異なります。 この結果、javax.lang.model.util.TypeVisitorの 既存の実装の動作に変化が生じる可能性があります』 もし,時限爆弾的にこれが起こったら…… Java8でしか使えない機能を実装後に非互換性が発覚→大変なことになる

後方互換性が維持されていることの確認が必要 ライブラリ更新のために必要な事 ライブラリの更新は頻繁に行われる[1] - 安全に更新できるかは分からない 後方互換性が維持されていることの確認が必要 - 新しい製品が古い製品を扱うことができること [1] Ihara, A., Fujibayashi, D., Suwa, H., Kula, R. G. and Matsumoto, K.: Understanding When to Adopt a Library: A Case Study on ASF Projects, Open Source Systems: Towards Robust Practices, pp. 128 -- 138 (2017).

後方互換性とは 新しい製品が古い製品を扱うことができること →”Java8”は”Java7で動くソフトウェア” に対して後方互換性を持つ  新しい製品が古い製品を扱うことができること →”Java8”は”Java7で動くソフトウェア” に対して後方互換性を持つ Java7 7のソフト 7のソフト 8のソフト Java7で 動くソフトウェアA Java8 順番考える 更新後のライブラリ 元のソフトウェア

後方互換性の現状 メジャー・マイナーアップデートともに後方互換性の維持は少ない Java においては23.5%でしか後方互換性が維持されていない[2] ライブラリの更新が自分に影響があるかどうかを簡単に 確認する方法はない 呼び出し方は一緒でも内部処理が変わっているかもしれない →更新後のライブラリが自分のソフトウェアにおいて   後方互換性を維持しているか確認する手段が必要である ライブラリの更新は頻繁に行われる(成熟したプロジェクトの更新は年1回とか,そうでない若いものは3か月以下で更新とか) [2] Mostafa, S., Rodriguez, R. and Wang, X.: Experience paper: a study on behavioral backward incompatibilities of Java software, Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis, pp. 215 -- 225 (2017).

提案手法 本研究では ライブラリのバージョン更新支援のためにテストケースを生成し, 実行トレースを比較する  ライブラリのバージョン更新支援のためにテストケースを生成し,  実行トレースを比較する ライブラリ更新に特化した手法である  従来手法ではライブラリの後方互換性を十分に担保できない 単体テスト Relative Debugging[3] マイナーバージョンアップデートだとマイナーの一番古いやつと新しいやつ、メジャーだとマイナーの最新とメジャーの最古 [3] Abramson, D., Foster, I., Michalakes, J. and Sosi, R.:Relative debugging: a new methodology for debugging scientic applications, Communications of the ACM, pp.69 --77 (1996)

単体テスト 単体テストの実施方法 ライブラリ更新における単体テストの問題点 ソフトウェアに対して用意されたテストスイートを実行する テストがすべて通れば正常に動作していると判断する ライブラリ更新における単体テストの問題点 単体テストは単純であるため,バージョン間での差異が十分に 検出できないことがある 回帰テストの不十分性は示されている[2] 結合テスト,システムテストまでするとコストが大きくなる ライブラリ更新は頻繁に行われるため 多くのAPIを連続で呼び出した際にのみ生じるエラーを検知できない [2] Mostafa, S., Rodriguez, R. and Wang, X.: Experience paper: a study on behavioral backward incompatibilities of Java software, Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis, pp. 215 -- 225 (2017).

Relative Debugging Relative Debugging[3] 二つのプログラムをステップ実行し,各ステップで同一のデータを 保持しているか確認する ステップ実行に差分が生じた段階でそれを開発者に通知する ライブラリ更新における Relative Debugging の問題点 ステップごとに動作を記録するため大規模ソフトウェアで適用が困難である 実行を比較するためには十分なテストケースが必要である ライブラリの更新は頻繁に行われる(成熟したプロジェクトの更新は年1回とか,そうでない若いものは3か月以下で更新とか) [3] Abramson, D., Foster, I., Michalakes, J. and Sosi, R.:Relative debugging: a new methodology for debugging scientic applications, Communications of the ACM, pp.69 --77 (1996)

任意の位置における変数情報を実行を止めずに取得可能 提案手法の概要 ライブラリの更新前後における振舞いの変化を記録・比較する 記録する手法としては卒業研究で開発したデバッガの技術を使用 特徴 ライブラリ更新の回帰テストに特化した手法である ライブラリ呼出し前後のみに着目 手作業でライブラリのテストケースを記述する必要はない すでにあるテストケースを有効に活用 任意の位置における変数情報を実行を止めずに取得可能 指導教官の石尾先生のSelogger辺りを使えば任意の情報を持ってこれる

入力 “x,y” に対する戻り値 “list” を テストケースとして記録しておく 提案手法のアイディア(1/3) x,y ... list=libraryA(x,y); list ソフトウェア ライブラリA (ver1.0) 入力 “x,y” に対する戻り値 “list” を テストケースとして記録しておく

提案手法のアイディア(2/3) x,y list 入力 “x,y” に対して,戻り値 “list” が更新前と ... list=libraryA(x,y); list ソフトウェア ライブラリA (ver1.0→ver1.1) 入力 “x,y” に対して,戻り値 “list” が更新前と 同じならライブラリAを更新しても問題ない

提案手法のアイディア(3/3) ライブラリ呼出し前の振舞いがバージョン間で一致していた場合に ライブラリ呼出し後の振舞いがバージョン間で一致する →更新後のライブラリが自分のソフトウェアにおいて 後方互換性を維持している 振舞いを確認するためにどの情報を見ればよいのか? ライブラリ呼出し直前の情報 ライブラリ呼出し直後の情報 ライブラリの引数 ライブラリの返り値 スコープ内の全変数 なし ライブラリ内でロードされたクラス ここに関しては具体的に

テストケースの生成手法 ライブラリに関する部分のみを テストケースへと変換 結合テストや受入テストの実行からトレースを収集 要件定義 基本設計 システムテスト ライブラリ 機能設計 結合テスト ライブラリ 詳細設計 単体テスト 一つの案 ライブラリに関する部分のみを テストケースへと変換 実装

まとめと今後の方針 背景として ライブラリの後方互換性が維持されているかどうかを確認したい 本研究で ライブラリのバージョン更新支援のためのテストケースを生成 実際の評価 実際に後方互換性が維持されていないものを検出できるか 後方互換性確認のための時間的・空間的コストはどうか