Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ミューテーション解析について調べた/2019-02-26-llt7

Satoshi SAKAO
February 26, 2019

 ミューテーション解析について調べた/2019-02-26-llt7

社内のLTイベント「えるLT Vol.7」で発表した資料です

Satoshi SAKAO

February 26, 2019
Tweet

More Decks by Satoshi SAKAO

Other Decks in Technology

Transcript

  1. 話すひと N2 インフォコム株式会社 オープンイノベーションセンター # アプリケーションエンジニア JS (ES6) / Node.js

    / GCP / IoT / iOS (Swift) エースコンバット7 / 技術士合格に向けた学習 Satoshi SAKAO @ottijp
  2. 具体例 N6 // monthが0〜11ならtrueを返す function isValid(month) { return month >=

    0 && month <= 11 } return month < 0 && month <= 11 return month >= 0 && month > 11 ミューテーション操作 ミュータント ミュータント
  3. 具体例 N7 return month >= 0 && month <= 11

    return month < 0 && month <= 11 return month >= 0 && month > 11 望ましいテスト結果 テストの失敗が期待される
  4. Swiftでやってみる N9 class MonthValidator { /// monthが0〜11であればtrueを返す func isValid(_ month:

    Int) -> Bool { return month >= 0 && month <= 11 } } // more Swifty return 0...11 ~= month
  5. Swiftでやってみる N10 final class swift_muterTests: XCTestCase { func testMonthValidator_valid() {

    XCTAssertEqual(MonthValidator().isValid(11), true) } func testMonthValidator_inValid() { XCTAssertEqual(MonthValidator().isValid(-1), false) } } 11 TRUE -1 FALSE
  6. Swiftでやってみる N11 $ muter -------------------------- Applied Mutation Operators -------------------------- File

    Position Applied Mutation Operator Mutation Test Result ---- -------- ------------------------- -------------------- swift_muter.swift Line: 4, Column: 18 Negate Conditionals passed swift_muter.swift Line: 4, Column: 32 Negate Conditionals failed -------------------- Mutation Test Scores -------------------- Mutation Score of Test Suite (higher is better): 50/100 File # of Applied Mutation Operators Mutation Score ---- ------------------------------- -------------- swift_muter.swift 2 50 ん?
  7. Swiftでやってみる N12 return month >= 0 && month >= 11

    2つめのミュータント 11 TRUE -1 FALSE ミュータントの欠陥を検出できない
  8. Swiftでやってみる N14 $ muter -------------------------- Applied Mutation Operators -------------------------- File

    Position Applied Mutation Operator Mutation Test Result ---- -------- ------------------------- -------------------- swift_muter.swift Line: 4, Column: 18 Negate Conditionals passed swift_muter.swift Line: 4, Column: 32 Negate Conditionals passed -------------------- Mutation Test Scores -------------------- Mutation Score of Test Suite (higher is better): 100/100 File # of Applied Mutation Operators Mutation Score ---- ------------------------------- -------------- swift_muter.swift 2 100 OK
  9. 留意点 • muterはプロジェクトディレクトリのキャッシュが悪さしがちなので注意 • Muter sometimes fails on Swift PM

    projects, probably due to module cache problems · Issue #72 · SeanROlszewski/muter • https://github.com/SeanROlszewski/muter/issues/72 • swift package clean できれいにしてあげると通る • muterはまだ比較演算子のミューテーションしか対応していない • LLVMレベルのミューテーション解析ライブラリもあったが試していない N19
  10. 等価ミュータントの例 N20 func isEven(_ n: Int) -> Bool { return

    n % 2 == 0 } ミュータント return -n % 2 == 0 ミュータントをkillするテストは書けない
  11. refs • ミューテーション解析 - Wikipedia • https://ja.wikipedia.org/ミューテーション解析 • ミューテーションテストに触れてみよう |

    ギャップロ • https://www.gaprot.jp/pickup/tips/mutation-testing • ソフトウェアのテスト品質を効果的に測定するミューテーション 解析 (1/3):CodeZine(コードジン) • https://codezine.jp/article/detail/10066 N21