Lietuvių

Susipažinkite su mutaciniu testavimu – galinga technika, skirta testų rinkinių efektyvumui įvertinti ir kodo kokybei gerinti. Sužinokite principus, naudą, įgyvendinimą ir geriausią praktiką.

Mutacinis testavimas: Išsamus kodo kokybės vertinimo vadovas

Šiandieninėje sparčiai besivystančioje programinės įrangos kūrimo aplinkoje, kodo kokybės užtikrinimas yra itin svarbus. Vieno komponento testai, integraciniai testai ir galutiniai testai yra esminės patikimo kokybės užtikrinimo proceso dalys. Tačiau vien tik testų buvimas negarantuoja jų efektyvumo. Būtent čia pasirodo mutacinis testavimas – galinga technika, skirta jūsų testų rinkinių kokybei įvertinti ir testavimo strategijos trūkumams nustatyti.

Kas yra mutacinis testavimas?

Mutacinis testavimas, iš esmės, yra apie mažų, dirbtinių klaidų įterpimą į jūsų kodą (vadinamų "mutacijomis") ir esamų testų paleidimą prieš modifikuotą kodą. Tikslas yra nustatyti, ar jūsų testai gali aptikti šias mutacijas. Jei testas nepavyksta įterpus mutaciją, mutacija laikoma "nužudyta". Jei visi testai praeina nepaisant mutacijos, mutacija "išgyvena", o tai rodo galimą jūsų testų rinkinio silpnumą.

Įsivaizduokite paprastą funkciją, kuri sudeda du skaičius:


function add(a, b) {
  return a + b;
}

Mutacijos operatorius gali pakeisti + operatorių į - operatorių, sukuriant tokį mutuotą kodą:


function add(a, b) {
  return a - b;
}

Jei jūsų testų rinkinyje nėra testavimo atvejo, kuris konkrečiai patvirtintų, kad add(2, 3) turėtų grąžinti 5, mutacija gali išgyventi. Tai rodo, kad reikia sustiprinti jūsų testų rinkinį išsamesniais testavimo atvejais.

Pagrindinės mutacinio testavimo sąvokos

Mutacinio testavimo privalumai

Mutacinis testavimas programinės įrangos kūrimo komandoms suteikia keletą reikšmingų privalumų:

Mutacijos operatoriai: pavyzdžiai

Mutacijos operatoriai yra mutacinio testavimo širdis. Jie apibrėžia kodo pakeitimų tipus, kurie atliekami siekiant sukurti mutantus. Štai keletas dažniausiai pasitaikančių mutacijos operatorių kategorijų su pavyzdžiais:

Aritmetinių operatorių pakeitimas

Santykių operatorių pakeitimas

Loginio operatoriaus pakeitimas

Sąlyginių ribų mutantai

Konstantos pakeitimas

Sakinio ištrynimas

Grąžinimo reikšmės pakeitimas

Konkretus naudojamų mutacijos operatorių rinkinys priklausys nuo programavimo kalbos ir naudojamo mutacinio testavimo įrankio.

Mutacinio testavimo įgyvendinimas: Praktinis vadovas

Mutacinio testavimo įgyvendinimas apima keletą žingsnių:

  1. Pasirinkite mutacinio testavimo įrankį: Yra keletas įrankių, skirtų skirtingoms programavimo kalboms. Populiariausi pasirinkimai apima:

    • Java: PIT (PITest)
    • JavaScript: Stryker
    • Python: MutPy
    • C#: Stryker.NET
    • PHP: Humbug

  2. Konfigūruokite įrankį: Konfigūruokite mutacinio testavimo įrankį, kad nurodytumėte tikrinamą išeities kodą, naudojamą testų rinkinį ir taikomus mutacijos operatorius.
  3. Atlikite mutacijos analizę: Paleiskite mutacinio testavimo įrankį, kuris generuos mutantus ir paleis jūsų testų rinkinį prieš juos.
  4. Analizuokite rezultatus: Išanalizuokite mutacinio testavimo ataskaitą, kad nustatytumėte išgyvenusius mutantus. Kiekvienas išgyvenęs mutantas rodo galimą spragą testų rinkinyje.
  5. Pagerinkite testų rinkinį: Pridėkite arba modifikuokite testavimo atvejus, kad nužudytumėte išgyvenusius mutantus. Sutelkite dėmesį į testų kūrimą, kurie konkrečiai nukreipti į kodo sritis, kurias išryškina išgyvenę mutantai.
  6. Pakartokite procesą: Kartokite 3-5 žingsnius, kol pasieksite patenkinamą mutacijos balą. Siekite aukšto mutacijos balo, tačiau taip pat apsvarstykite papildomų testų pridėjimo sąnaudų ir naudos santykį.

Pavyzdys: Mutacinis testavimas su Stryker (JavaScript)

Panagrinėkime mutacinį testavimą su paprastu JavaScript pavyzdžiu, naudojant Stryker mutacinio testavimo karkasą.

1 žingsnis: Įdiekite Stryker


npm install --save-dev @stryker-mutator/core @stryker-mutator/mocha-runner @stryker-mutator/javascript-mutator

2 žingsnis: Sukurkite JavaScript funkciją


// math.js
function add(a, b) {
  return a + b;
}

module.exports = add;

3 žingsnis: Parašykite vieneto testą (Mocha)


// test/math.test.js
const assert = require('assert');
const add = require('../math');

describe('add', () => {
  it('should return the sum of two numbers', () => {
    assert.strictEqual(add(2, 3), 5);
  });
});

4 žingsnis: Konfigūruokite Stryker


// stryker.conf.js
module.exports = function(config) {
  config.set({
    mutator: 'javascript',
    packageManager: 'npm',
    reporters: ['html', 'clear-text', 'progress'],
    testRunner: 'mocha',
    transpilers: [],
    testFramework: 'mocha',
    coverageAnalysis: 'perTest',
    mutate: ["math.js"]
  });
};

5 žingsnis: Paleiskite Stryker


npm run stryker

Stryker atliks mutacijos analizę jūsų kode ir sugeneruos ataskaitą, rodančią mutacijos balą ir visus išgyvenusius mutantus. Jei pradinis testas nepavyks nužudyti mutanto (pvz., jei anksčiau neturėjote testo add(2,3)), Stryker tai pabrėš, nurodydamas, kad jums reikia geresnio testo.

Mutacinio testavimo iššūkiai

Nors mutacinis testavimas yra galinga technika, jis taip pat kelia tam tikrų iššūkių:

Geriausia mutacinio testavimo praktika

Norėdami maksimaliai padidinti mutacinio testavimo naudą ir sušvelninti jo iššūkius, laikykitės šios geriausios praktikos:

Mutacinis testavimas skirtingose kūrimo metodikose

Mutacinis testavimas gali būti efektyviai integruotas į įvairias programinės įrangos kūrimo metodikas:

Mutacinis testavimas vs. kodo aprėptis

Nors kodo aprėpties metrikos (tokios kaip eilučių aprėptis, šakų aprėptis ir kelio aprėptis) teikia informaciją apie tai, kurios kodo dalys buvo vykdomos testų metu, jos nebūtinai rodo tų testų efektyvumą. Kodo aprėptis pasako, ar kodo eilutė buvo vykdoma, bet ne tai, ar ji buvo *teisingai patikrinta*.

Mutacinis testavimas papildo kodo aprėptį, suteikdamas matą, kaip gerai testai gali aptikti klaidas kode. Aukštas kodo aprėpties balas negarantuoja aukšto mutacijos balo ir atvirkščiai. Abi metrikos yra vertingos vertinant kodo kokybę, tačiau jos teikia skirtingas perspektyvas.

Pasauliniai mutacinio testavimo aspektai

Taikant mutacinį testavimą pasauliniame programinės įrangos kūrimo kontekste, svarbu atsižvelgti į šiuos aspektus:

Mutacinio testavimo ateitis

Mutacinis testavimas yra besivystanti sritis, ir vykdomi tyrimai yra sutelkti į jo iššūkių sprendimą ir efektyvumo didinimą. Kai kurios aktyvių tyrimų sritys apima:

Išvada

Mutacinis testavimas yra vertinga technika jūsų testų rinkinių kokybei įvertinti ir pagerinti. Nors jis kelia tam tikrų iššūkių, dėl patobulinto testų efektyvumo, aukštesnės kodo kokybės ir sumažintos klaidų rizikos tai yra vertinga investicija programinės įrangos kūrimo komandoms. Laikydamiesi geriausios praktikos ir integruodami mutacinį testavimą į savo kūrimo procesą, galite kurti patikimesnes ir tvirtesnes programines programas.

Kadangi programinės įrangos kūrimas vis labiau globalizuojasi, aukštos kokybės kodo ir efektyvių testavimo strategijų poreikis yra svarbesnis nei bet kada. Mutacinis testavimas, sugebėdamas tiksliai nustatyti testų rinkinių trūkumus, vaidina lemiamą vaidmenį užtikrinant visame pasaulyje kuriamos ir diegiamos programinės įrangos patikimumą ir tvirtumą.

Mutacinis testavimas: Išsamus kodo kokybės vertinimo vadovas | MLOG