SlideShare a Scribd company logo
企業のソフトウェア開発に対する
自動プログラム修正技術適用
に関する産学連携事例紹介
日本電信電話株式会社
肥後芳樹
大阪大学
丹野治門
自動プログラム修正(APR)とは
プログラムから全自動でバグを取り除く技術
バグのある
ソフトウェア
正しく動く
ソフトウェア
自動プログラム
修正技術 2
APR with 遺伝的アルゴリズム
バグのある
ソフトウェア
5
2
6
3
4
8
7
6
9
8
10
6
テストケース(10個)
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:10
入力値:3
期待値:27 3
もう少し具体的に…
入力
• バグのあるプログラム
• テストケース
出力
• 全テストを通過するプログラム
処理
• 選択と変異を繰り返して修正
入力
出力
終了判定
選択と変異
Yes
No
バグ箇所の限局
初期変異
限局:バグの原因箇所を推定する
選択:評価値の高いプログラムを選ぶ
変異:怪しい箇所を変更したプログラムを生成する
4
変異の例
• プログラム文の追加,削除,置換の3パターン
• 入力されたプログラム内の文を変更に用いる
• 未通過テストで実行されるプログラム文が変更の対象
1: void gcd(int a, int b){
2:   if(a == 0){
3:     printf(“%d”, b);
4:   }
5:   while(b != 0){
6:     if(a > b)
7:       a = a – b;
8:     else
9:       b = b – a;
10: ...
11: ...
修正対象
1: void gcd(int a, int b){
2:   if(a == 0){
3:     printf(“%d”, b);
4:   }
5:   a = a – b;
6:   while(b != 0){
7:     if(a > b)
8:       a = a – b;
9:     else
10:      b = b – a;
11: ...
変異A
1: void gcd(int a, int b){
2:   if(a == 0){
3:     printf(“%d”, b);
4:   }
5:   while(b != 0){
6:     if(a > b)
7:       a = a – b;
8:     else
9:
10: ...
11: ...
変異B
1: void gcd(int a, int b){
2:   if(a == 0){
3:     printf(“%d”, b);
4:   }
5:   while(b != 0){
6:     if(a > b)
7:       printf(“%d”, b);
8:     else
9:       b = b – a;
10: ...
11: ...
変異C
1: void gcd(int a, int b){
2:   if(a == 0){
3:     printf(“%d”, b);
4:     exit(0);
5:   }
6:   while(b != 0){
7:     if(a > b)
8:       a = a – b;
9:     else
10:      b = b – a;
11: ...
変異D
5
バグ箇所の限局
void gcd(int a, int b) {
if (a == 0) {
printf("%d", b);
} 
while (b != 0)
if (a > b)
a = a ‐ b;
else 
b = b ‐ a;
printf("%d", a);
exit(0);
}
a == 0
printf("%d", b);
b != 0
a > b
a = a ‐ b; b = b ‐ a;
printf("%d", a);
exit(0);
START
END
テスト2
a = 4, b = 2
true
true
true
false
false
false
テスト1
a = 1, b = 1
テスト3
a = 0, b = 1
出力=1 出力=2 無限ループ
6
void gcd(int a, int b) {
if (a == 0) {
printf("%d", b);
} 
while (b != 0)
if (a > b)
a = a ‐ b;
else 
b = b ‐ a;
printf("%d", a);
exit(0);
}
テスト2
a = 4, b = 2
テスト1
a = 1, b = 1
テスト3
a = 0, b = 1
バグ箇所の限局
7
バグのある
プログラム
void gcd(int a, int b) {
if (a == 0) {
printf("%d", b);
exit(0);
} 
while (b != 0)
if (a > b)
a = a ‐ b;
else 
b = b ‐ a;
printf("%d", a);
exit(0);
}
正しく動く
プログラム
void gcd(int a, int b) {
if (a == 0) {
printf("%d", b);
} 
while (b != 0)
if (a > b)
a = a ‐ b;
else 
b = b ‐ a;
printf("%d", a);
exit(0);
}
8
共同研究のモチベーション
• 既存研究ではAPRのバグ修正能力のみを評価
• 開発現場にAPRを導入する際にどのような障壁
があるのか不明
共同研究におけるリサーチクエスチョン
9
RQ1: 企業ソフトウェアのバグはAPRで修正できるのか?
RQ2: ソフトウェア開発にAPRを導入するにはどのような
障壁が存在するのか?
RQ1: 企業ソフトウェアのバグは
APRで修正できるのか?
10
結果:13の対象バグのうち,1つのみ修正できた
for(int i; i < num; i++) {
if(checkNum(i)) {
list = new ArrayList<>();
+    break; 
}
list.add(num);
}
return list;
for(int i; i < num; i++) {
if(checkNum(i)) {
list = new ArrayList<>();
+    return list; 
}
list.add(num);
}
return list;
開発者の修正 APRの修正
現状のAPR技術は修正能力が十分ではない
バグのあるコード
RQ2: ソフトウェア開発にAPRを
導入する障壁は何か?
11
障壁1 対象バグの少なさ
障壁2 テストケースの不足
障壁3 複数行修正の困難さ
障壁4 パラメータ調整の困難さ
• 対象は開発が完了したJavaソフトウェア
• 利用した資材:リポジトリ,バグ票,テストケース
• 必要に応じて開発者からのフィードバック
• 各バグに対してAPRを適用
• APRの適用を通じて,以下の障壁を発見
障壁1 対象バグの少なさ
12
多くのバグが自動プログラム修正の対象外
408
170
80
24
1
0
50
100
150
200
250
300
350
400
450
13
提供されたバグ 単体テストで発見 開発者修正 修正がJavaのみ テストが存在
障壁2 テストケースの不足
13
boolean isPositive(int a){
if (a > 0)
return true;
else
return true;
}
テスト1
a = 1
期待値 true
テスト2
a = 0
期待値 false
OK NG
✓
✓
✓
✓
怪しさ
0.7
0.0
1.0
返り値 true 返り値 true
障壁2 テストケースの不足
14
boolean isPositive(int a){
if (a > 0)
return true;
else
return true;
}
1
0.7
0.0
1.0
10
0.3
0.0
1.0
100
0.1
0.0
1.0
成功するテストの数
変化なし
減少
正しい箇所の怪しさが高いと…
• 修正に長い時間が必要
• 不必要な変更が加わる
障壁2 テストケースの不足
• 開発者
• 少ないテストで多くの箇所をチェックしたい
• 命令網羅,分岐網羅,条件網羅…
• 自動プログラム修正技術
• テストはたくさんある方がよい
• 網羅率は上がらなくてもテスト数は多い方がよい
15
開発者のテスト作成方法がAPRと合っていない
障壁3 複数行修正の困難さ
16
11個
85%
2個
15%
複数行の修正が
必要なバグ
単一行の変更で
修正できるバグ
現時点では複数行修正が難しい
障壁4 パラメータ調整の困難さ
パラメータの種類
• シード値
• 各世代で生成するプログラムの数
• 変異と交叉の割合
• 最大世代数
• …
17
67個
どのようにパラメータを組み合わせれば
バグ修正が(短時間で)できるのか不明
これまでの取り組みと成果
• 一年目(2017年度)
• 開発プロセスへのAPR導入に向けた
フィージビリティスタディ
• 主な成果
• SES2018での発表(企業賞の受賞)
• 国際会議ICPC2018での発表
• 二年目(2018年度)
• 自動バグ限局のソースコード以外への拡張
• 対象バグが少ないのは,2017年度に発見した障壁の1つ
• 主な成果
• SES2019で発表予定 18
共同研究が円滑に進んだ理由
お互い(産と学)のDutyが明確
• 阪大側:既存ツールを対象ソフトウェアに対して適用
• 阪大側:研究成果の論文化
• …
メール以外でのコミュニケーション
• Rocket.Chat(チャット型コミュニケーション)
• ownCloud(オンラインストレージ)
産(NTT)からの資材の提供が柔軟
• 阪大内で対象ソフトウェアの資材の閲覧可能
19
産学連携の良い点(阪大側視点)
• 技術を作る側だけでなく利用者側の視点が入る
• 独りよがりの研究にならないために
• 対象ソフトウェアの開発者からのフィードバックは
手法の改良および評価に有益
• 世の中に役に立つ研究をしているいう実感
• モチベーションを維持することは重要
• 大学院生への教育効果
• 論文の投稿機会が増える
• 最近はIndustry trackを設けている国際会議も多い
20
産学連携の良い点(NTT側視点)
• 高いレベルの学術的な知見を得られる
• 自分たちの取り組みを学術的観点から体系的に位置づ
けて知ることができるようになる
• 最先端の論文内容をわかりやすく教えてもらえる
• 研究のモチベーションが向上する
• 先生,学生と議論させていただき,意見をもらうこと
で(特に若手社員の)視野の広がり,モチベーション
も向上する
• 中長期的を見据えた社員の人材育成に有効と感じる
• 研究論文の書き方のノウハウを知ることができる

More Related Content

What's hot

ありえるえりあ勉強会@五反田~テスト編~ Part2
ありえるえりあ勉強会@五反田~テスト編~ Part2ありえるえりあ勉強会@五反田~テスト編~ Part2
ありえるえりあ勉強会@五反田~テスト編~ Part2Tomoyuki Sato
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善
Mizuho Wakai
 
コードの複雑さを測ろう
コードの複雑さを測ろうコードの複雑さを測ろう
コードの複雑さを測ろうShinya_131
 
DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新
DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新
DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新
tomohiro odan
 
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
Game Tools & Middleware Forum
 
RICOH最終選考プレゼン資料
RICOH最終選考プレゼン資料RICOH最終選考プレゼン資料
RICOH最終選考プレゼン資料
pyar6329
 

What's hot (6)

ありえるえりあ勉強会@五反田~テスト編~ Part2
ありえるえりあ勉強会@五反田~テスト編~ Part2ありえるえりあ勉強会@五反田~テスト編~ Part2
ありえるえりあ勉強会@五反田~テスト編~ Part2
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善
 
コードの複雑さを測ろう
コードの複雑さを測ろうコードの複雑さを測ろう
コードの複雑さを測ろう
 
DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新
DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新
DMMアカウントサービス フロントエンド改善支援のためのTestcafeを用いた自動e2eテストの刷新
 
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
 
RICOH最終選考プレゼン資料
RICOH最終選考プレゼン資料RICOH最終選考プレゼン資料
RICOH最終選考プレゼン資料
 

Similar to 企業のソフトウェア開発に対する自動プログラム修正技術適用に関する産学連携事例紹介

Klocworkのご紹介
Klocworkのご紹介Klocworkのご紹介
Klocworkのご紹介
Masaru Horioka
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
Tatsuya Ishikawa
 
Code complete ch22_developper_test
Code complete ch22_developper_testCode complete ch22_developper_test
Code complete ch22_developper_test
Sho Shimauchi
 
2020.08 paiza
2020.08 paiza2020.08 paiza
2020.08 paiza
ssuser7faecc
 
Paiza
PaizaPaiza
2020.07paiza
2020.07paiza2020.07paiza
2020.07paiza
ssuser7faecc
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
hakoika-itwg
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
Seiji KOMATSU
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
ichikaway
 
「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04
「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04
「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04Makoto Nonaka
 
テスト自動化クロニクル (JaSST 東海 2016)
テスト自動化クロニクル (JaSST 東海 2016)テスト自動化クロニクル (JaSST 東海 2016)
テスト自動化クロニクル (JaSST 東海 2016)
Keizo Tatsumi
 
『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)
『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)
『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)
MLSE
 
【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか #rakutentech
【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか  #rakutentech【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか  #rakutentech
【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか #rakutentech
Kotaro Ogino
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門Satoshi Watanabe
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki public
Kazuaki Ishizaki
 
Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料Akiko Kosaka
 
Web制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテストWeb制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテスト
祐磨 堀
 
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
SEGADevTech
 
ソフトウェアテスト入門
ソフトウェアテスト入門ソフトウェアテスト入門
ソフトウェアテスト入門
iKenji
 
事例からわかる!テスト自動化導入パターン
事例からわかる!テスト自動化導入パターン事例からわかる!テスト自動化導入パターン
事例からわかる!テスト自動化導入パターン
友隆 浅黄
 

Similar to 企業のソフトウェア開発に対する自動プログラム修正技術適用に関する産学連携事例紹介 (20)

Klocworkのご紹介
Klocworkのご紹介Klocworkのご紹介
Klocworkのご紹介
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
Code complete ch22_developper_test
Code complete ch22_developper_testCode complete ch22_developper_test
Code complete ch22_developper_test
 
2020.08 paiza
2020.08 paiza2020.08 paiza
2020.08 paiza
 
Paiza
PaizaPaiza
Paiza
 
2020.07paiza
2020.07paiza2020.07paiza
2020.07paiza
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
 
「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04
「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04
「事実にもとづく管理」によるソフトウェア品質の改善 ー ヒンシツ大学 Evening Talk #04
 
テスト自動化クロニクル (JaSST 東海 2016)
テスト自動化クロニクル (JaSST 東海 2016)テスト自動化クロニクル (JaSST 東海 2016)
テスト自動化クロニクル (JaSST 東海 2016)
 
『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)
『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)
『鼎談:新しいプログラミングパラダイムとしての深層学習』 資料(萩谷 昌己)
 
【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか #rakutentech
【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか  #rakutentech【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか  #rakutentech
【楽天テックカンファ前夜祭2014】誰がテスト自動化をするべきか #rakutentech
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki public
 
Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料Agile japan2010 rakuten様プレゼン資料
Agile japan2010 rakuten様プレゼン資料
 
Web制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテストWeb制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテスト
 
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
 
ソフトウェアテスト入門
ソフトウェアテスト入門ソフトウェアテスト入門
ソフトウェアテスト入門
 
事例からわかる!テスト自動化導入パターン
事例からわかる!テスト自動化導入パターン事例からわかる!テスト自動化導入パターン
事例からわかる!テスト自動化導入パターン
 

企業のソフトウェア開発に対する自動プログラム修正技術適用に関する産学連携事例紹介