Hur man bygger en egen "säng på naglar" testare för din 3D-skrivare elektronik (13 / 14 steg)
Steg 13: Testare programvara
Om du inte använder en RAMBo ombord emellertid, kommer att du behöva anpassa mjukvaran till din styrelse. Programmet skrevs nyligen om från grunden för att en enkel port i andra styrelser. Grundläggande förståelse för Python programmering krävs dock.
Den nya designen möjliggör en mer modulsystem där varje test representeras av ett unikt objekt och varje testtypen genomförs i sin egen klass. Några basklasser finns att ta hand om de grundläggande funktionerna i testfall, loggning mekanism och testning logik.
Tester / modul innehåller basklasser och testa moduler. Basklasser är:
- TestCase: Detta är basklass för ett testfall genomförs för att testa en specifik funktion
- TestContext: Detta är basklass för sammanhanget ges till testerna när de körs
- TestRunner: Detta är basklassen för klassen löpare som kommer att köras varje test i testsviten.
Finns det några generella tester, såsom TestGPIO i gpio.py och TestAnalog analog.py som själva har mer specifika testa klasser som härrör från dem som TestMosfets och TestEndstops som härrör från TestGPIO och TestThermistors, TestVRefs och TestSupplyRails som härrör från TestAnalog. Det finns också några specifika tester som ProgramFirmware som är en testet wrapper för avrdude och TestMotors som kommer att testa stegmotorer och verifiera alla fungerar korrekt.
För att genomföra ett nytt test, måste du härleda från klassen TestCase och åsidosätta metoderna _test och _verify . Metoden _test måste köra testet med hjälp av vad finns i objektet sammanhang (mer om det senare) medan metoden _verify måste in "self.status" till ett värde i TestStatus enum.
Det sammanhang objekt som skickas till metoderna som _test och _verify är ett objekt som härrör från TestContext, dess syfte är att skicka runt information mellan de tester som kan användas av testfall. Till exempel finns gränssnitt tillgång DUT i context.target medan registeransvarige finns som context.controller. De flesta tester kommer också att kräva tillgång till specifika fält från objektet context.pinmapping.
Du kommer att behöva härleda en klass från TestContext för att tillhandahålla informationen som krävs till testfall. De flesta särskilt i din klass måste du instansierar ett self.pinmapping -objekt. Om du behöver ström på/av strömförsörjningen innan och efter en provkörning till exempel, kan du göra det genom att åsidosätta metoderna TestingStarted och TestingEnded .
Slutligen, skulle du behöva genomföra en ny klass för din styrelse som härrör från TestRunner. Här är enkelt, du behöver bara definiera en self.tests variabel som innehåller en lista över TestCase objekt och gå tillbaka ramen du skapat via egenskapen sammanhang .
Du kan sedan skapa TestRunner objektet och anropar metoden kör för att köra alla tester, eller du kan ge den en lista över specifika tester ska köras om du önskar.
Det finns mycket mer man kan säga om programvara, som dödlig, krävs, _finally testfall, eller hur till konfigurera loggning system att använda en databas, eller hur att få sammanfattningen av tester avrättningen, eller inaktivera specifika test, vad varje test status innebär osv... Men källkoden är ganska enkel och väl dokumenterad och kan du upptäcka en hel del saker genom att läsa koden.
Jag lämnar dig med en mockup av en potentiell GUI för programvaran test där GUI kan genereras dynamiskt från en TestRunner instans och som ger kontroll av varje test för användaren.