Tilda11 höstterminen 2011 Laboration: Whitebox- och blackboxtesting Mål med laborationen Du ska lära dig begreppen white-box testing och black-box testing Du ska öva dig på att konstruera testfall Du ska öva dig på att testa program som någon annan har skrivit Du ska för två program hitta både några testfall som fungerar som förväntat och några som inte gör det Introduktion Det är första gången vi genomför den här labben. Om du kör fast kanske det innebär att vi inte har förklarat något tillräckligt bra. Om du behöver hjälp eller har frågor går det bra att skicka ett mail till Diana på följande adress: dianaeks@kth.se. Tveka inte att höra av dig om du har frågor! Den här labben ska genomföras och redovisas individuellt men det är ok att diskutera problemen tillsammans med en kamrat. Om testning I den här labben ska du öva dig på två olika sätta att felsöka program: white-boxtesting (glassboxtesting) och black-boxtesting. Dessa metoder används både för att hitta fel och förebygga fel. Skillnaden är att i white-boxtesting ser du källkoden, ungefär som du är van vid att felsöka dina egna program och i black-boxtesting är källkoden dold. Om systemet BlackBoxTesting I den här laborationen kommer du att testa två program. Du kommer att få problemformuleringarna till båda men källkoden får du bara till det första problemet. Du ska testa dem genom att skicka indata till programmen och jämföra producerad output med förväntad output. För att systematiskt kunna testa program använder du dig av programmet BlackBoxTesting. Detta program tar tre parametrar: den första är namnet på problemet, andra är namnet på din indatafil och tredje är namnet på filen med förväntad output. Programmet kommer köra en gång för varje rad som finns i inputfilen. indata.txt förväntad_output.txt BlackBoxTestsystemet Jämförelse av förväntad output och verklig output.
När systemet har jämfört den verkliga outputen från programmet med den förväntade (som du skickade in) kommer resultatet att presenteras i en tabell. Nedan följer ett exempel: INPUT EXPECTED ACTUAL AGREE? OUTPUT OUTPUT 'hejsan' 'Hejsan java!' 'hej java!' No 'en lång rad som'...(0) 'Hejsan java!' 'hej java!' No '<nothing>' 'Hejsan java!' '<nothing>' No De två första kolumnerna motsvarar de filer du har skickat in till systemet. Den tredje visar den output som programmet du testar verkligen producerade. Den sista kolumnen svarar helt enkelt på frågan om förväntad output (kolumn 2) är samma som verklig output (kolumn 3). Det finns några specialfall som kan uppstå i tabellen: Fotnoter (som på rad 2) dyker upp då en post i tabellen är för stor för att få plats. Alla rader i tabellen som inte har kunnat visas i sin helhet i summeringstabellen presenteras efter att tabellen har visats i en lista. Taggen <nothing> (som i sista raden i exemplet) indikerar att indata eller utdata saknas för en rad i tabellen. Kan exempelvis uppstå om in.txt och ans.txt har olika antal rader. Taggen <Time Limit Exceeded> (fanns inte i exemplet ovan), som indikerar att programmet tog för lång tid att köra för en viss input, om denna dyker upp är det möjligt att det har uppstått en oändlig loop. Uppgifter 1. White-boxtest av binärsökning (a) Studera uppgiftsformuleringen i appendix 1. (Observera att du inte ska programmera någon egen lösning, du behöver bara testa den lösning som redan finns!) (b) Ta en titt på lösningsförslaget i appendix 2 (c) Hitta på testdata för problemet. Spara indata i en fil, exempelvis bin_in.txt. Spara förväntad utdata i en annan fil, exempelvis bin_ans.txt. Du kör testprogrammet från terminalfönstret. Använd följande kommando: /info/tilda11/testlabb/blackboxtest BinSearch bin_in.txt bin_ans.txt Om du får mycket output på skärmen kan det vara bekvämare att pipa in resultatet till en egen fil, tex så här:
/info/tilda11/testlabb/blackboxtest BinSearch bin_in.txt bin_ans.txt > res.txt (d) Dra slutsatser av resultatet. Fortsätt att testa tills du är nöjd. Vid redovisningen: Visa testdata och körningsresultat för åtminstone 8 testfall, i några av dessa testfall ska programmet fungera som förväntat och i några ska det inte fungera som förväntat. 2. Black-boxtest av Select-problemet Utförs på samma sätt som förra uppgiften, steg (a) till (d), men denna gång är inte källkoden tillgänglig. (Du ska inte heller denna gång programmera någon lösning utan endast testa ett program som redan finns.) Problemlydelsen finns i appendix 3. Om du exempelvis döper dina testfiler till select_in.txt och select_ans.txt kan programmet testas med: /info/tilda11/testlabb/blackboxtest Select select_in.txt select_ans.txt Vid redovisningen: Visa testdata och körningsresultat för åtminstone 8 testfall, i några av dessa testfall ska programmet fungera som förväntat och i några ska det inte fungera som förväntat. 3. Reflektiva frågor: (a) Det är ofta inte rimligt att testa alla möjliga indata. Hur väljer man ut lämpliga testfall om man vill ha så få testfall som möjligt men ändå känna att man har testat det mesta? (b) Påstående: Det går inte att bevisa att ett program fungerar som det ska med BlackBoxTestning. Håller du med om det? Förklara varför med minst ett argument. (c) Kan man bevisa att ett program inte fungerar med BlackBox testing? (d) Vilka slutsatser kan man dra om programmet visar TimeLimitExceeded i tabellen? (e) Man kan tänka sig att skriva testfallen till ett program först och skriva själva programmet sist. (Så kallad test-first- och test-last programmering). Antag att det hade varit obligatoriskt att testa kursens labb 6 (formelkoll) med test-first eller test-last men att man fick välja metod själv. Skulle du i så fall välja test-first eller test-last? Förklara varför. (Svara på frågan även om du inte har gjort labb6 ännu) Redovisningen Denna laboration ska du redovisa muntligt för Diana. Boka tid genom att maila och föreslå en tid som passar dig. Före redovisningen ska du dessutom maila dina svar till dianaeks@kth.se. Det räcker med kortfattade skriftliga svar på uppgift 3. Dina svar kommer att anonymiseras och kan komma att användas som exjobbsunderlag och kursförbättring.
Appendix 1. Problemformulering för binärsökning Skriv ett program som implementerar binärsökning. Programmet ska läsa in en sträng på formen [intarray], söktnyckel och returnera den indexposition där nyckeln förekommer. Indexeringen börjar från 0. Om nyckeln inte förekommer ska -1 returneras. Exempel på körning: >python BinarySearch.py [1,2,3],1 0 >python BinarySearch.py [1,2,3],4-1 2. Föreslagen lösning: Binsearch.py # -*- coding: utf-8 -*- #This file may contain bugs! from sys import stdin def binsok(listan, nyckel): '''Söker i "listan" efter "nyckel". Returnerar indexet där nyckeln hittades, -1 om den inte hittades''' vanster = 0 hoger = len(listan)-1 found = False while vanster <= hoger and not found: mitten = int((vanster + hoger)/2) if listan[mitten] == nyckel: found = True return mitten else: if nyckel < listan[mitten]: hoger = mitten else: vanster = mitten return found def getarrayandkey(string):... return int_array, key def main(): inrad = stdin.readline().strip() array,key = getarrayandkey(inrad) print(binsok(array,key)) try: main() except ValueError: print ("Felaktigt format")
3. Problemformulering för Select-problemet Skriv ett program som implementerar select-problemet. Detta problem tar en heltalsarray och ett heltal, k som indata. Dessa hämtar programmet genom att läsa in en sträng på formen [intarray], k. Programmet ska sedan skriva ut det k:te minsta elementet i arrayen. Om k är 1 ska exempelvis det allra minsta elementet returneras. Om det finns flera exemplar av samma element kommer olika k att kunna ge samma resultat. Om k är större än antalet element ska texten För stork k visas. Om k är mindre än 1 ska texten För litet k visas. Om indata inte är på rätt format ska texten Felaktigt format visas. - Se exemplen nedan! Exempel på körning: >Select [1,3,2,4], 2 2 [1,1,5],1 1 [1,1,5],2 1 [1,2,3], 0 För litet k [1,b,3], apa Felaktigt format [1,2,3], 4 För stort k