what is mutation testing
このチュートリアルでは、ミューテーションテストとは何か、その実行方法、およびミューテーションテストの種類について例を挙げて説明します。
ミューテーションテストとは何ですか?
ミューテーションテストは、ソフトウェアプログラムのバリエーションがテストデータセットの対象となる障害ベースのテスト手法です。これは、偏差を分離する際のテストセットの有効性を判断するために行われます。
少し複雑に聞こえますね。
学習内容:
ミューテーションテスト
ミューテーションテスト(MT)は、学校のプロジェクトとして最初に提案された70年代にまでさかのぼります。それは非常に多くのリソースを消費したので、それは取り消されました。しかし、人間がより高度なコンピューターを開発し続けるにつれて、それはゆっくりと復活し、現在最も人気のあるテスト手法の1つになっています。
ミューテーションテストの定義
MTは別名 障害ベースのテスト、プログラムの変更、エラーベースのテスト、 または ミューテーション分析 。
名前が示すように、ミューテーションテストは、変更またはミューテーションに基づくソフトウェアテストタイプです。定義されたテストケースがコードのエラーを検出できるかどうかを確認するために、わずかな変更がソースコードに導入されています。
理想的なケースは、どのテストケースも合格しないことです。テストに合格した場合は、コードにエラーがあることを意味します。ミュータント(コードの修正バージョン)が生きていたと言います。テストが失敗した場合、コードにエラーはなく、ミュータントは強制終了されました。私たちの目標は、すべてのミュータントを殺すことです。
ミューテーションテストは、より効果的なテストケースを作成するために、定義されたテストケースまたはテストスイートの品質をテストするのにも役立ちます。殺すことができる変異体が多ければ多いほど、テストの質は高くなります。
ミューテーションテストの概念
ミューテーションテストについてさらに説明する前に、出くわすいくつかの概念を調べてみましょう。
#1)ミュータント: これは単にソースコードの変更されたバージョンです。微細な変更を含むコードです。テストデータをミュータントで実行すると、理想的には元のソースコードとは異なる結果が得られるはずです。ミュータントは ミュータントプログラム 。
変異体にはさまざまな種類があります。これらは次のとおりです。
- 生き残った突然変異体: すでに述べたように、これらは、ソースコードの元のバリアントと変異したバリアントを介してテストデータを実行した後もまだ生きている変異体です。これらは殺されなければなりません。それらは生きた突然変異体としても知られています。
- 殺されたミュータント: これらは、ミューテーションテスト後に殺されるミュータントです。これらは、ソースコードの元のバージョンと変更されたバージョンから異なる結果が得られたときに得られます。
- 同等の変異体: これらは生きている変異体と密接に関連しており、テストデータを実行した後でも「生きている」のです。それらが他のものと異なるのは、構文が異なっていても、元のソースコードと同じ意味を持っていることです。
#2)ミューテーター/ミューテーション演算子: これらは突然変異を可能にするものであり、「運転席」にあります。それらは基本的に、ミュータントバージョンを持つためにソースコードに加える変更または変更の種類を定義します。それらはと呼ぶことができます 障害または突然変異のルール 。
#3)突然変異スコア: これは、変異体の数に基づくスコアです。
以下の式を使用して計算されます。
ご了承ください、 突然変異スコアを計算するとき、同等の突然変異体は考慮されません。突然変異スコアは、 突然変異の妥当性 。私たちの目的は、高い突然変異スコアを達成することです。
ミューテーションテストを行う方法
ステップ1: ジャスミンのユニットテストを書いてみましょう。
テストスイート(ジャスミン)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
ステップ2: 元のコードを記述します。
元のコード(Javascript)
const user_info = () => { mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age > daughter_age) { alert(`Daughter's age is ${daughter_age}. Mother's age is ${mother_age}. Welcome to the Mother-Daughter program`) } else { alert(`Daughter's age: ${daughter_age}, is more than mother's age: ${mother_age}. Please enter correct ages`) } } user_info();
ステップ3: 次に、元のコードでテストを実行して、最初からテストに失敗していないことを確認します。失敗がゼロのテストを実際に作成したことを伝える出力が必要です。
例えば:
0.019秒で終了1スペック、0失敗、シード31435でランダム化
元のコードの結果:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
ステップ4: 変異体を紹介します。この場合、 大なり記号 演算子(mother_age> daughter_age)から 未満 演算子(mother_age ミュータントコード(Javascript) ステップ5: 次に、ミュータントコードを介してテストを実行します。 テスト結果は次のとおりです。 0.017秒で終了1スペック、0失敗、シード89555でランダム化 ミュータントコードの結果: ステップ6: 元のバージョンとミュータントバージョンの結果を比較します。この場合、同じテストスイートが使用されたとしても、それらは異なります。したがって、私たちは変異体を殺しました。したがって、私たちのテストスイートは準備が整っています。 突然変異にはいくつかの種類があります。これらについて以下に説明します。 ここでは、パラメーターや定数値を通常+/- 1ずつ変更することにより、突然変異を導入します。 例:元のコード(Javascript) 上記のコードが偶数を乗算することを意図していた場合 私<4 、次に値の変更は、初期化をに変更することを意味します i = 1とします 。 例:ミュータントコード(Javascript) ここでは、コードブロック内のステートメントを削除または複製します。コードブロック内のステートメントを再配置することもできます。 たとえば、if-elseブロックでは、else部分またはif-elseブロック全体を削除できます。 例:元のコード(Javascript) 例:ミュータントコード(Javascript) ここでのターゲットは、決定を下すコードです。 例えば、 値の比較。変えることができます >から< 母娘プログラムの例のように。 切り替えることができる他の演算子には、次のものがあります。 ミューテーションテスト(MT)の利点は次のとおりです。 ミューテーションテスト(MT)のデメリットは次のとおりです。 ツールは、変異体の生成プロセスをスピードアップするのに役立ちます。 MTで使用できるツールは次のとおりです。 Stryker、Jumble、PIT、およびInsure ++。 例から学びましょう: たとえば、新しいユーザーが登録できる病院のサイトがあります。患者の生年月日または年齢を読み取ります。 14より大きい場合は、一般医を主治医として割り当てます。そのために、利用可能な医師を見つける「一般医師」機能を呼び出します。 さて、他の機能があるかもしれません。たぶん、13歳未満の患者は小児科医などに割り当てられます。ただし、14歳以上の場合のみを取り上げます。 コードは次のようになります。 1) 年齢を読む 上記のコード行は特定のプログラミング言語に固有のものではなく、実行されないことに注意してください。それは単なる架空のものです。 テスターとして、私のデータセットが14、15、0、13の場合、いくつかの乱数。 目標は、4つの値(14、15、0、および3)のデータセットが、このコードで発生する可能性のあるすべての問題を特定するのに十分かどうかを確認することです。 ミューテーションテストはこれをどのように達成しますか? 何よりもまず、プログラムのバリエーションであるミュータントを作成します。ミュータントは、逸脱として書かれたプログラムに他なりません。自己シード障害が含まれています。 例は次のとおりです。 これらの代替品は、 「突然変異演算子。」 例を示しましょう: ミュータント#1:関係演算子置換 1)年齢を読む ミュータント#2: 1)年齢を読む ミュータント#3: 1)年齢を読む ミュータント#4: 1)年齢を読む ミュータント#5:ステートメントの削除 1)年齢を読む ミュータント#6:絶対値の挿入 1)年齢を読む ミュータント#7:構文が正しくありません 1)年齢を読む ミュータント#8:元のテストと同じことをします 1)年齢を読む 一度、すべての変異体が作成されます。それらはテストデータセットの対象となります。私たちのセットは14、15、0、13です。これらの変異体のどれが私たちのデータセットで見つかりますか? 以下の表をご覧ください。 (画像をクリックすると拡大表示されます) ご覧のとおり、データ値14は、ミュータント2、3、および4に対して実行すると失敗を検出します。または、14はミュータント2、3、および4に対して実行します。ただし、1、6、および8に対しては効果がありません。 データセットがすべてのミュータントを殺す場合、それは効果的です。 それ以外の場合は、より多くのまたはより良いテストデータを含めます。データセットの各値がすべての変異体を殺す必要はありません。しかし、一緒に、彼らはすべてを殺す必要があります。例えば:14は2、3、4を殺します。15は1、2、4を殺します。 5、7、8はどうですか? ミュータント#5 – は、指定したデータ値に関係なく失敗するプログラムインスタンスです。これは、有効な値と無効な値の両方に対してプログラミングを行わないためです。 ミュータント#7 - コンパイルエラーになります。または、スクリプト言語の場合、実行を妨げるエラー。 ミュータント#8 - メインプログラムと同じものです。 ご覧のとおり、上記の変異体はまったく役に立ちません。 したがって、避けるべき変異体は次のとおりです。 これだけの労力がかかるとしたら、コードの大きなサンプルをテストしなければならないときにどうなるか考えていますか? ミューテーションテストは、次の2つに依存しています。 そう、 コードの最小単位に焦点を当て、ミューテーションテストをより大きなプログラムにスケーリングするプログラマーのスキルに信頼を置いています。 このチュートリアルでは、ミューテーションテストの定義、タイプ、およびこのテストを実行するための手順を例を挙げて詳しく説明しました。この興味深いテスト手法であるミューテーションテストを読んで学んでいただければ幸いです。 著者について: この記事はSTHチームメンバーのSwatiSによって書かれました。 以下のコメント、質問、考えを共有してください。 const user_info = () =>{ mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age
Daughter's age: 5, is more than mother's age: 20. Please enter correct ages
ミューテーションテストの種類
#1)値の変化
let arr = [2,3,4,5] for(let i=0; i
let arr = [2,3,4,5] for(let i=1; i
#2)ステートメントの変更
let arr = [2,3,4,5] for(let i=0; i
let arr = [2,3,4,5] for(let i=0; i
#3)意思決定の突然変異
元のオペレーター ミュータント演算子 1 <= > = 二 > = == 3 === == 4 そして または 5 || &&
ミューテーションテストツール
ミューテーションテストの詳細
2) 14歳以上の場合
3) Doctor = General Physician()
4) 次の場合に終了
2)年齢が<’
3)Doctor = General Physician()
4)終了する場合
2)age = 14の場合「>を=に変更」
3)Doctor = General Physician()
4)終了する場合
2)年齢> = 14の場合「>を> =に変更」
3)Doctor = General Physician()
4)終了する場合
2)年齢が<=’
3)Doctor = General Physician()
4)終了する場合
2)年齢= 14の場合
3)「医師の割り当てステートメントを削除する」
4)終了する場合
2)14歳以上の場合
3)Doctor = Mr.X(絶対値の挿入-Xが小児科医であるとしましょう)
4)終了する場合
2)年齢%% 14の場合(構文が正しくありません)
3)Doctor = General Physician()
4)終了する場合
2)14歳以上で14歳以上の場合「14歳以上と同じ意味」
3)Doctor = General Physician()
4)終了する場合
注意点
配列javaから値を削除する方法
結論
推奨読書