リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案

Slides:



Advertisements
Similar presentations
Trac と Eclipse の 便利な機能. プロジェクト管理システム: Trac 0. はじめに バージョン管理システム: Subversion 統合開発環境: Eclipse ・ Wiki による情報 管理 ・進捗状況の管理 ・プログラムの作 成 ・リポジトリに データを集める.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
シーケンス図の生成のための実行履歴圧縮手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
CKメトリクスを用いてリファクタリングの 効果を予測する手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
進捗 Javaバイトコード変換による 細粒度CPU資源管理
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
リファクタリング中に生じる コンパイルエラーの自動解消手法
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
CKメトリクスに基づくリファクタリングの 効果予測手法の提案と実装
Javaプログラムの変更を支援する 影響波及解析システム
社会シミュレーションのための モデル作成環境
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
アスペクト指向言語のための 独立性の高いパッケージシステム
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
Java における 先進的リフレクション技術
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
dcNavi: デバッグ方法をアドバイス する関心事指向リポジトリナビゲータ
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア工学 知能情報学部 新田直也.
統合開発環境によって表現された 言語機構によるコードのモジュール化
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
dcNavi:デバッグ支援のための グラフベース推薦システム
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
メソッドの同時更新履歴を用いたクラスの機能別分類法
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
統合開発環境のための プログラミング言語拡張 フレームワーク
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案 リファクタリングのための  変更波及解析を利用した   テスト支援ツールの提案 大阪大学 大学院情報科学研究科  吉田昌友,吉田則裕,松下誠,井上克郎 2009/12/18 SIGSS

発表目次 リファクタリングの一環として行うテスト作業 テスト作業の問題点と研究方針 提案ツール ケーススタディと議論 まとめと今後の課題 既存技術:変更波及解析について 提案ツール 既存のリファクタリング支援機能とその拡張 ケーススタディと議論 まとめと今後の課題 2009/12/18 SIGSS

リファクタリング ソフトウェアの外部的振る舞いを保ちつつ, 理解や修正が簡単になるように, ソースコードの構造を改善する作業[1] 外部的振る舞い : 仕様に対応するソフトウェアの動作 ソースコードの特徴に応じて, さまざまなリファクタリングパターンが定義されている [1] M. Fowler, et al., Refactoring: Improving The Design of Existing Code, Addition Wesley, 1999. 2009/12/18 SIGSS

リファクタリングに共通する手順 1.リファクタリングを検討すべき部分を特定 2.対象部分について現在の設計を理解 3.リファクタリング完了時の設計を決定 4.ソースコードを編集 5.ソースコードをコンパイル 6.外部的振る舞いが保たれていることを確認する 完了 本研究の支援対象であるテスト作業を行う 2009/12/18 SIGSS

リファクタリングにおけるテストの重要性 外部的振る舞いが保たれていることを テストを行うことで確認する         テストを行うことで確認する テストの実行結果が,リファクタリングを目的として ソースコードを編集する前と編集した後で同じ 外部的振る舞いが変化する可能性がある部分を テストするテストケースがあることが必須 ソースコードをコンパイルする度にテストを行う → プログラム形式のテストケース(JUnit等)を   使用することが推奨されている 2009/12/18 SIGSS

リファクタリングの例(1/2) メソッドの引き上げ(Pull Up Method)[1]を行う対象 テストケースの一部 呼出 重複した Parallelogram テストケースの一部 public void testCalculateArea() { Parallelogram parallelogram = new DiamondShape(3, 4); assertEquals(12, parallelogram.calculateArea()); } Rectangle calculateArea DiamondShape 呼出 重複した メソッド calculateArea 『リファクタリング』のp.16のメソッドの移動の例 最初のテストは実行された状態であることが前提. 後のテストで,編集にミスがなかったか確認. (コードクローン) [1] M. Fowler, et al., Refactoring: Improving The Design of Existing Code, Addition Wesley, 1999. 2009/12/18 SIGSS

リファクタリングの例(2/2) ParallelogramにcalculateArea()をコピー 1 3 calculateArea テスト ケース 実行 5 DiamondShape Rectangle 2 calculateArea 4 calculateArea 1   ParallelogramにcalculateArea()をコピー 2   DiamondShape.calculateArea()を削除 3   テストケースを実行し,外部的振る舞いを確認 4   Rectangle.calculateArea()を削除 5   テストケースを実行し,外部的振る舞いを確認 2009/12/18 SIGSS

発表目次 リファクタリングの一環として行うテスト作業 テスト作業の問題点と研究方針 提案ツール ケーススタディと議論 まとめと今後の課題 既存技術:変更波及解析について 提案ツール 既存のリファクタリング支援機能とその拡張 ケーススタディと議論 まとめと今後の課題 2009/12/18 SIGSS

外部的振る舞いを確認する際の注意点 1.振る舞いが変化した可能性がある部分を把握 2.振る舞いが変化した可能性がある部分をテストする リファクタリングを 行う開発者 2.振る舞いが変化した可能性がある部分をテストする   テストケースだけを使用してテストを実行 振る舞いが変わるかもしれない部分→実際には編集の影響が波及する部分を含む. 編集するソースコード(  )以外にも 振る舞いが変化する可能性がある部分が存在 2009/12/18 SIGSS

編集が影響する部分の例 メソッドの引き上げで,ParallelogramクラスとDiamondShapeクラスのソースコードを編集した場合 ポリモーフィズムを利用しているソースコード メソッドの引き上げで,ParallelogramクラスとDiamondShapeクラスのソースコードを編集した場合 ソースコードの一部 Parallelogram ... Parallelogram parallelogram = new DiamondShape(...); total += parallelogram.calculateArea() calculateArea 呼出 呼出 DiamondShape calculateArea()を呼び出す ソースコードは編集していない しかし,外部的振る舞いは 変化した可能性がある calculateArea 2009/12/18 SIGSS

テストケースを絞り込む上での問題点 結局,すべてのテストケースを使用してテストを 実行しなければ,振る舞いが確認できない 把握 リファクタリングを 行う開発者 編集が影響した部分(  )を把握することが困難なので, 実行すべきテストケースを絞り込むことが困難 振る舞いが変わるかもしれない部分→実際には編集の影響が波及する部分を含む. 結局,すべてのテストケースを使用してテストを 実行しなければ,振る舞いが確認できない 2009/12/18 SIGSS

研究方針 変更波及解析を利用して, 外部的振る舞いを確認するために使用 すべきテストケースを自動的に絞り込む 今回は,以下の内容について発表 上記の内容を実装したツール ツールの適用例 今後の課題 2009/12/18 SIGSS

発表目次 リファクタリングの一環として行うテスト作業 テスト作業の問題点と研究方針 提案ツール ケーススタディと議論 まとめと今後の課題 既存技術:変更波及解析について 提案ツール 既存のリファクタリング支援機能とその拡張 ケーススタディと議論 まとめと今後の課題 2009/12/18 SIGSS

実行結果が変化した可能性がある各テストケース 既存技術:変更波及解析 [2] ソースコードに対する編集が影響する部分を特定する技術 テストする 編集前 ソース コード 編集後 ソース コード テスト ケース [2] X. Ren, et al., Chianti: A Tool for Change Impact Analysis of Java Programs, OOPSLA ‘04. 入力 差分から 編集の集合を特定 2バージョンの コールグラフを生成 出力 実行結果が変化した可能性がある テストケース(メソッド)を特定 Affected Tests 実行結果が変化した可能性がある各テストケース (メソッド)に影響した編集を特定 Affecting Changes 2009/12/18 SIGSS

変更波及解析の処理:編集の集合を特定 Customer Rental getMovie getDaysRented amountFor ソースコードの差分から,編集の集合を特定 → atomic changesとして表現する (メソッドの追加・変更・削除,クラスの追加・削除,フィールドの 追加・削除など) Customer Rental getMovie getDaysRented amountFor amountFor Add Method Rental.amountFor Change Method Rental.amountFor Change Method Customer.amountFor Delete Method Customer.amountFor 2009/12/18 SIGSS

変更波及解析の処理:コールグラフを生成 編集前 編集後 テストケースのメソッドに対応するノードを始点とする コールグラフを,編集前後のソースコード毎に生成 public void testAmountFor() { Customer aCustomer = new Customer(…); … Rental aRental = new Rental(…); assertEquals( 1.5, aCustomer.amountFor (aRental) ); } CustomerTest.testAmountFor CustomerTest.testAmountFor 呼出 Customer.Customer Customer.amountFor Customer.Customer Rental.amountFor Rental.getMovie 編集後, 呼出先が変更 Rental.getMovie 編集前 編集後 ※上記のグラフは部分グラフである 2009/12/18 SIGSS

変更波及解析の処理: Affected TestsとAffecting Changes   編集前と同じ実行結果を 編集後に出さない可能性がある   実行結果は 実行するメソッドで決まる atomic changesとコールグラフの対応をとる Affected Tests Affected Tests CustomerTest.testAmountFor CustomerTest.testAmountFor 呼出 Customer.Customer Customer.amountFor Customer.Customer Rental.amountFor 編集後は 内容が変化 or 存在しない 編集後に 内容が変化 or 追加された Rental.getMovie Rental.getMovie 編集前 編集後 Add Method Rental.amountFor Change Method Rental.amountFor Change Method Customer.amountFor Delete Method Customer.amountFor Affecting Changes 2009/12/18 SIGSS

発表目次 リファクタリングの一環として行うテスト作業 テスト作業の問題点と研究方針 提案ツール ケーススタディと議論 まとめと今後の課題 既存技術:変更波及解析について 提案ツール 既存のリファクタリング支援機能とその拡張 ケーススタディと議論 まとめと今後の課題 2009/12/18 SIGSS

Eclipseのリファクタリング支援機能(1/2) 2.リファクタリングメニューから「引き上げ」を選ぶ メソッドを引き上げたいクラスを選択する 1.引き上げたいメソッドにカーソルを合わせる 引き上げたいメソッドを選択する 2009/12/18 SIGSS

Eclipseのリファクタリング支援機能(2/2) 適用するコード変換をプレビューで確認する (リファクタリングを中止することも可能) 同時に引き上げたいメソッドを選ぶ コード変換を適用した後,開発者が テストを実行して外部的振る舞いを確認する プレビューページを表示する 2009/12/18 SIGSS

提案ツールの概要 1.リファクタリング 内容を設定 リファクタリング 支援機能 変更波及解析機能 2.変更波及解析 の実行を指示 ソースコード テストケース 入力 入力 入力 1.リファクタリング   内容を設定 リファクタリング 支援機能 変更波及解析機能 出力 2.変更波及解析   の実行を指示 変換 されたソースコード 入力 出力 3.実行すべき   テストケースを   把握 外部的振る舞いを確認するために 実行すべきテストケース 2009/12/18 SIGSS

提案ツールの設計 以下の2つの要求がある → 以下のような設計にする 適用するコード変換の内容を確認した上で,変更波及解析を実行したい コード変換を適用する前に,変更波及解析を実行したい → 以下のような設計にする プレビューページの次に,変更波及解析を実行するためのページを追加する プレビューページに表示されているコード変換前後のソースコードに変更波及解析を適用する プレビューページに表示されているコード変換前後のソースコードに変更波及解析を適用する 2009/12/18 SIGSS

提案ツールの実装方針 Eclipseのリファクタリング・ウィザードから,既存の変更波及解析ツールChiantiを呼び出す リファクタリング・ウィザードは,EclipseのLanguage Toolkit内に実装されていることを確認 プレビューページの次に,Chiantiの実行設定画面を移植したウィザードページを追加 プレビューページに表示されているコード変換前後のソースコードをChiantiに入力する プレビューページに表示されているコード変換の内容を,EclipseのJava開発ツールから取得 Chiantiに入力するコード変換後のソースコードは,変換前のソースコードに対し,取得した変換内容を適用することで生成 適用するリファクタリングの内容を設定するユーザインタフェースのこと 2009/12/18 SIGSS

発表目次 リファクタリングの一環として行うテスト作業 テスト作業の問題点と研究方針 提案ツール ケーススタディと議論 まとめと今後の課題 既存技術:変更波及解析について 提案ツール 既存のリファクタリング支援機能とその拡張 ケーススタディと議論 まとめと今後の課題 2009/12/18 SIGSS

ケーススタディ(1/2) 1.入力するテストケースを選択する 1.入力するテストケースを選択する 変更波及解析の設定をする 2.変更波及解析を実行する 2009/12/18 SIGSS

ケーススタディ(2/2) 変更波及解析の 結果が提示される 実行すべきテストケース テストケースがテストする変更 変更波及解析を実行した 2009/12/18 SIGSS

議論 開発者がソースコード,テストケースを読んでテストケースを選択する時間を削減できる 開発者がテストケースの選択を誤る可能性を削減できる 限られたテストケースだけを実行すればよいので,テストの実行時間を削減できる 2009/12/18 SIGSS

発表目次 リファクタリングの一環として行うテスト作業 テスト作業の問題点と研究方針 提案ツール ケーススタディと議論 まとめと今後の課題 既存技術:変更波及解析について 提案ツール 既存のリファクタリング支援機能とその拡張 ケーススタディと議論 まとめと今後の課題 2009/12/18 SIGSS

まとめ リファクタリングを行う上での問題 外部的振る舞いをテストで確認する必要性 → 振る舞いが変化する可能性のある部分を   開発者が正確に把握することは困難 → 実行すべきテストケースの把握が困難 Eclipseのリファクタリング支援機能 変更波及解析 以上を組み合わせ,外部的振る舞いを確認 するために実行すべきテストケースを提示 2009/12/18 SIGSS

今後の課題 実験で有用性を評価 別のリファクタリングパターンに適用 リファクタリングを行うためにより使いやすいユーザインタフェース 通常のリファクタリングと変更波及解析を利用する場合とを比較 既存の変更波及解析ツールを使用する場合と提案ツールを使用する場合とを比較 別のリファクタリングパターンに適用 リファクタリングを行うためにより使いやすいユーザインタフェース 2009/12/18 SIGSS