Yunit 10 / 11

Panganib sa Maling Pagtitiwala, Kalidad ng Pagsubok, at Pagsusuri sa Mutation: Mga Pagsusuri sa Pagsusuri

Mga nadagdag:

  • Kakayahang kilalanin ang tatlong mukha ng pseudo-trust (non-assertive, self-asserting, trivial assert) at mag-apply ng antidotes
  • Kakayahang gumamit ng pagsusuri sa mutation at marka ng mutation bilang isang mas tumpak na sukat ng kalidad kaysa sa porsyento ng saklaw sa pamamagitan ng tool o kamay
  • Kakayahang iposisyon ang AI bilang isang pulang koponan laban sa pagsubok at paghahanap ng mga butas sa pagsubok nang hindi nahuhulog sa bitag ng papuri

Sa gitna ng modyul na ito ay isang paulit-ulit na babala: ang isang berdeng kumikinang na panel ng pagsubok ay hindi katibayan ng kalidad. Kung ang iyong mga pagsubok ay nagbibigay sa iyo ng kumpiyansa, kailangan mong malaman kung ang kumpiyansa na iyon ay totoo o peke. Sa edad ng artificial intelligence (AI), ang tanong na ito ay mas kritikal kaysa dati, dahil ang AI ay sanay sa paggawa ng tuluy-tuloy, makinis ngunit walang laman na mga pagsubok. Maling kumpiyansa — ang paniniwalang tama ang software dahil berde ang mga pagsubok, kahit na ang mga pagsubok ay hindi nagbe-verify ng anuman—ay ang pinaka-mapanganib na bagay na maaaring mangyari sa isang QA team; dahil hindi nito itinatago na walang mga error, ngunit hindi mo makikita ang mga error. Pinagsasama-sama ng unit na ito ang pilosopiya ng pagpapatunay ng buong module sa isang disiplina: pagsubok sa iyong mga pagsusulit.

Ang pamantayang ginto para sa pagsukat ng kalidad ng pagsubok: pagsusuri sa mutation

Ang pinakamabisang paraan upang maunawaan kung talagang nagpoprotekta o hindi ang isang pagsubok ay ang pagsusuri sa mutation (pagsusuri sa mutation - isang pamamaraan na gumagawa ng sinasadyang maliliit na pagbaluktot/mutation sa source code at sinusukat kung natukoy ng mga pagsubok ang mga pagbaluktot na ito). Ang lohika ay simple: kung sinasadya mong sirain ang code (ginagawa ang isang + sa -, isang > sa >=, isang true sa false), ang isang magandang test suite ay dapat mahuli ang katiwalian na iyon at maging pula. Kung hindi, ang pagkaantala ay isang nakaligtas na mutant — kaya hindi talaga pinapanatili ng iyong mga pagsusuri ang gawi na iyon.

Mutation score = napatay ang mutation / total mutation. Ang isang package na may 90% line coverage ay maaaring magkaroon ng mutation score na 40%; Ito ay nagpapahiwatig na ang mga linya ay gumagana ngunit ang pag-uugali ay hindi na-verify. Ang marka ng mutation ay isang mas matapat na sukat ng kalidad kaysa sa saklaw ng porsyento.

Tip: May mga awtomatikong mutation tool (PIT/Pitest para sa Java, Stryker para sa JavaScript/TypeScript, Stryker.NET para sa .NET, mutmut para sa Python). Ang mga ito ay awtomatikong bumubuo at sumusubok ng daan-daang mutasyon. Kung wala kang tool, kahit na ang manu-manong paraan ng "break the code test" ay napakahalaga para sa mga kritikal na function.

Ang tatlong mukha ng pseudo-trust at ang antidote nito

Pseudo-trust form

sintomas

panlunas

Pagsubok nang walang paninindigan

Gumagana ang code, walang napatunayan

Tunay na paninindigan sa bawat pagsubok; pagsubok na may mutation

pagsubok na nagpapatunay sa sarili

Inaasahan = output ng code

Kalkulahin ang inaasahang halaga nang nakapag-iisa

Walang kuwentang paninindigan

"not null", "200 ang ibinalik"

Patunayan ang panuntunan sa negosyo/aktwal na resulta

Mataas na saklaw ng kamalian

90% na linya, mababang proteksyon

Tingnan ang marka ng mutation

Marupok na pagsubok tolerance

"Stuck na naman, pass"

Root cause + deterministic testing

Paggamit ng AI bilang isang "pulang koponan"

Ang AI ay maaaring parehong bumuo ng pseudo-trust at maging isang malakas na kaalyado sa pangangaso nito. Gamitin ang AI bilang isang pulang koponan laban sa sarili mong mga pagsubok: tanungin ang "magsulat ng code na pumasa sa mga pagsubok na ito ngunit mali" o "maghanap ng subversion na magpapaloko sa mga pagsubok na ito." Kung nakahanap ang AI ng mga butas sa iyong mga pagsubok, ang mga butas na iyon ay tunay na mga panganib.

Babala: Huwag tanungin ang AI "Maganda ba ang kalidad ng aking pagsubok?" at kunin ang sagot na "oo, mahusay" bilang katiyakan. Ang AI ay may posibilidad na maging mabait. Sa halip, hamunin ang AI sa isang kongkretong gawain: "gumawa ng isang bug na pumasa sa mga pagsubok na ito." Kung ito ay makagawa nito, ang iyong mga pagsubok ay bulag sa pagkakamaling iyon.

Katumbas na mutasyon at limitasyon ng marka

Makapangyarihan ang pagsusuri sa mutation, ngunit mayroon itong catch: hindi binabago ng ilang mutasyon ang pag-uugali ng code. Ang mga ito ay tinatawag na katumbas na mutations (katumbas na mutant — sira na code, mutation na gumagawa ng eksaktong kaparehong resulta gaya ng orihinal). Halimbawa, ang pagbabago ng paunang halaga ng isang variable na hindi kailanman ginagamit ay hindi makakaapekto sa output; Walang pagsubok na maaaring at hindi dapat mahuli ito. Samakatuwid, ang 100% mutation score ay kadalasang hindi makakamit sa pagsasanay at hindi ang layunin. Ang pagtanggal ng mga katumbas na mutasyon sa pamamagitan ng kamay ay labor intensive; Kaya't huwag basahin ang marka ng mutation bilang isang ganap na marka ng pagsusulit, ngunit bilang isang matapat na tagapagpahiwatig ng "talaga bang nagpoprotekta ang aking mga pagsusulit?"

Ang praktikal na diskarte ay ito: sa halip na patuloy na magpatakbo ng pagsusuri sa mutation sa buong base ng code, patakbuhin ito sa mga module na naglalaman ng pinakamataas na panganib at pinakakumplikadong mga panuntunan sa negosyo. Isa-isang suriin ang mga nabubuhay na mutasyon sa mga modyul na ito; Kung ito ay isang tunay na agwat, magdagdag ng isang pagsubok; kung ito ay katumbas na mutation, markahan ito ng katwiran at ipasa. Ang AI ay maaaring magsagawa ng paunang screening sa pagtatasa kung ang isang nakaligtas na mutation ay katumbas; ngunit ang panghuling desisyon ay gagawin mo na nakakaalam kung ano ang ginagawa ng code.

Babala: Ang pagsusuri sa mutation ay mahal sa computation (lahat ng nauugnay na pagsubok ay muling pinapatakbo para sa bawat mutation). Kaya ang isang karaniwan at makatwirang diskarte ay ang pag-iskedyul nito bilang isang lingguhan o pre-release na malalim na pagsusuri para sa mga kritikal na module, sa halip na bawat pagsasama.

Mahinang prompt / Malakas na prompt

Mahina: "Sapat ba ang aking mga pagsubok?"
Strong: "Kumilos bilang isang red team para sa function at test suite na ito. (1) Bumuo ng 8 mutations sa code na maaaring patayin (operator substitution, boundary shift, condition inversion, return value substitution). (2) Para sa bawat mutation, isaad kung alin sa mga kasalukuyang pagsubok ang makakahuli nito at kung alin ang HINDI. (3) Para sa bawat mutation na mabubuhay, sumulat ng bagong pagsubok na makakapagdulot din ng mga code na ito na makakapatay sa lahat ng mga halimbawang ito. (4) sumusubok ngunit lumalabag sa panuntunan ng negosyo+mga pagsubok: [i-paste]"

Napakahusay na prompt; Ipinoposisyon nito ang AI bilang isang test-breaking examiner, hindi isang praise machine.

Apat na maaaring kopyahin na mga template

1) Manu-manong kontrol sa mutation:

Bumuo ng 8 makabuluhang mutasyon (minor intentional disruptions) para sa code na ito: arithmetic operator substitution, comparison limit (> vs >=), logical inversion, return/constant substitution, condition skipping. Para sa bawat mutation, hulaan kung alin sa mga available na pagsubok ang makakahuli nito o hindi. Code+tests: [i-paste]

2) Pagpatay sa nabubuhay na mutation:

Ang sumusunod na ulat sa pagsusuri ng mutation ay naglalaman ng mga nakaligtas (hindi nahuli) na mga mutasyon: [listahan/ulat]. Para sa bawat isa, magsulat ng kaunting pagsubok na papatay sa mutation na iyon (magiging pula ang code kapag nasira sa ganoong paraan). Magkomento sa kung anong pag-uugali ang kinukumpirma ng pagsubok.

3) Red team - dugo ang pagsusuri:

Maaari ka bang magsulat ng code na PUMASA SA LAHAT ng mga sumusunod na pagsubok, ngunit lumalabag sa sumusunod na tuntunin ng negosyo: [pamantayan sa negosyo]. Kung gayon, anong butas sa mga pagsubok na ito ang nagpapahintulot nito? Idagdag ang pagsubok na magsasara ng butas na iyon. Mga pagsubok: [i-paste]

4) Pagsusuri sa kalidad ng inspeksyon:

Tingnan ang test suite na ito para sa kalidad. Lagyan ng tsek para sa bawat pagsubok:- Mayroon bang totoong paninindigan o props ba ito?- Independyente ba ang inaasahang halaga, nagmula sa code?- Bine-verify ba nito ang tuntunin ng negosyo o isang bagay na walang halaga? Sa wakas, magbigay ng tinantyang "true assert score" at ang 3 pinakamahina na pagsusulit. Mga pagsubok: [i-paste]

tatlong mini case

Case 1 — Coverage 92%, mutation score 38%. Isang team ang umasa sa mataas na coverage. Kapag ang pagsusuri sa mutation ay pinatakbo kasama si Stryker, ang marka ay 38%: karamihan sa mga mutasyon na ginawa ay nakaligtas. Ito ay patunay na ang mga pagsubok ay hindi nagpapatakbo ng mga linya at nagpapatunay sa pag-uugali. Ang koponan ay namuhunan ng tatlong linggo sa kalidad ng pagsubok; Tumaas ang marka ng mutation sa 81%, at dalawang totoong error sa pagkalkula ang nakuha ng mga pinahusay na pagsubok na ito sa susunod na paglabas.

Kaso 2 — Nilinlang ng AI ang pagsubok. Gamit ang template na "pulang koponan", isang eksperto ang humiling sa AI ng code na pumasa sa mga kasalukuyang pagsubok ngunit lumabag sa panuntunan ng diskwento. Sumulat ang AI ng code na palaging nagbabalik ng diskwento na zero — at nanatiling berde ang lahat ng pagsubok dahil walang pagsubok na nagbe-verify sa aktwal na halaga ng diskwento. Nakita ang puwang, idinagdag ang mga totoong paninindigan.

Kaso 3 — Ang bitag ng papuri. Tinanong ng isang junior tester ang AI, "Maganda ba ang aking mga pagsubok?" at nakahinga ng maluwag nang marinig ang sagot, "Very comprehensive." Ang kanyang senior na kasamahan ay may parehong mga pagsusulit na na-audit gamit ang template na "pagsusuri sa kalidad ng audit"; Ito ay lumabas na 12 sa 20 mga pagsubok ay palamuti (nang walang paggiit o basura). Ang tamang tanong ay nagdala ng tamang sagot.

Mga karaniwang pagkakamali

  • Nagkakamali ng saklaw para sa kalidad. Umaasa sa mataas na saklaw ng hilera at hindi tumitingin sa marka ng mutation sa lahat.
  • Nagtitiwala sa papuri ng AI. Nagtatanong "Maganda ba ang iyong mga pagsusulit?" at isinasaalang-alang ang positibong sagot bilang katiyakan.
  • Pagkuha ng inaasahang halaga mula sa code. Mga pagsubok sa sarili na nagpapatunay na nagkukumpirma ng may sira na code.
  • Maging kontento sa mga walang kuwentang pahayag. Mga tseke na hindi nagpapatunay sa aktwal na panuntunan, gaya ng "hindi null", "200 ang ibinalik."
  • Hindi pinapansin ang mga nakaligtas na mutasyon. Hindi pinapansin kung ano ang hindi nahuli sa ulat ng mutation.
  • Hindi man lang sinusubukang manu-manong i-mutate ang kritikal na code. Nilaktawan ang hakbang na "break the code and test" kung hindi available ang tool.

Sa buod

Pseudo-trust ay naniniwala na ang software ay tama dahil ang mga pagsubok ay berde; samantalang ang mga pagsubok ay maaaring walang kumpirmasyon ng anuman. Ang pamantayang ginto para sa pagsukat nito ay ang pagsusuri sa mutation: sadyang sinira ang code at sinusukat kung nahuli ito ng mga pagsubok. Ang marka ng mutation ay isang mas matapat na sukat ng kalidad kaysa sa saklaw ng porsyento. Ang AI ay parehong gumagawa ng pseudo-trust at nagiging isang makapangyarihang red team sa paghahanap nito — magtanong ng "gumawa ng bug na pumasa sa mga pagsubok na ito." Subukan ang iyong mga pagsubok: true assert, independent na inaasahang halaga, validation ng panuntunan sa negosyo, at mga pinatay na mutasyon.

Gawain ng aplikasyon

Mag-import ng function na naglalaman ng panuntunan sa negosyo at mga pagsubok nito mula sa sarili mong proyekto. Kung maaari, magpatakbo ng mutation tool (Stryker/Pitest/mutmut) at sukatin ang mutation score; Kung walang tool, bumuo ng hindi bababa sa 8 mutations gamit ang template na "manual mutation control" at subukan ang mga ito nang manu-mano. Para sa bawat nakaligtas na mutation, sumulat ng bagong pagsubok na may template na "kill surviving mutation". Panghuli, gamit ang pattern na "pulang koponan", tingnan kung ang AI ay makakagawa ng code na niloloko ang iyong mga pagsubok. Iulat ang iyong marka ng pagsisimula at pagtatapos ng mutation (o nahuli/kabuuang rate ng mutation).

checklist

  • [ ] Sinuri ko ang kalidad ng pagsubok ayon sa marka ng mutation, hindi saklaw.
  • [ ] Nagpatakbo ako ng pagsusuri sa mutation (sa pamamagitan man ng tool o mano-mano) para sa kritikal na code.
  • [ ] Sumulat ako ng mga bagong pagsubok para sa bawat nakaligtas na mutation.
  • [ ] Ginamit ko ang AI bilang pulang koponan at naghanap ng mga butas sa aking mga pagsubok.
  • [ ] Hindi ko kinuha ang papuri ng AI na "magaling ang iyong mga pagsubok" bilang katiyakan.
  • [ ] Sinuri ko na ang bawat pagsubok ay nagbe-verify ng aktwal na paggigiit, independiyenteng inaasahang halaga, at panuntunan ng negosyo.