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