Urnik 09.00 – 10.30 Unit testing, TDD DUnit, DUnit2, DUnitX, TestInsight 10.30 – 11.00 odmor 11.00 – 12.30 Unit testing v resničnem svetu, mocking
Preizkušanje enot
»Unit« Testing »unit« <> »unit« »unit« = »enota« = majhen samostojen del programa razred
Zakaj? Odpornost proti napakam Olajšano predelovanje Testiranje robnih pogojev Dokumentacija Dobra zasnova programov
Kdaj? Pred spreminjanjem programa Med programiranjem Pred commitom V build serverju Med izdelavo release verzije
TDD Najprej test, nato koda repeat WriteATest(); WatchItFail(); WriteTheCode(); WatchTestPass(); until false;
Kako? Čim manjši del funkcionalnosti Le en test pravilnosti Izogibamo se if in case Pripravi, pokliči, preveri Najprej pogosti primeri, nato robni Preverimo proženje izjem Preverimo vse možne poti Medsebojno neodvisni preizkusi
Ogrodja
DUnit [JUnit] Juanco Anez Od 2005 del Delphija Čarovnika za izdelavo projekta in testnega primera Grafično in tekstovno izvajalno okolje
API TTestCase Setup TearDown RegisterTest CheckXXXX ExpectedException
Izvajanje for i := FirstTest to LastTest do begin testCase := TMyTestCase.Create; try testCase.Setup; RunTestCase(testCase, i); finally testCase.Teardown; end; finally testCase.Free; end; end;
DUnit2 [DUnit] Peter McNab http://dunit2.sourceforge.net/ Združljiv
Izboljšave Testira »puščanje« pomnilnika XML reporter Obsežnejši API Hierarhični testi Testiranje programov (simulacija interakcije) GUIAutomation Hitrejše izvajanje
Izvajanje testCase := TMyTestCase.Create; try for i := FirstTest to LastTest do begin testCase.Setup; RunTestCase(testCase, i); finally testCase.Teardown; end; end; finally testCase.Free; end;
DUnitX Moderna zasnova Vincent Parrett (Final Builder) https://github.com/VSoftTechnologies/DUnitX
Atributi [TestFixture] [Setup], [TearDown] [SetupFixture], [TearDownFixture] [Test], [TestCase] [RepeatTest] [Ignore] [Category]
API Assert.XXXX Assert.WillRaise
TestInsight Integrirani grafični poganjalnik za DUnit, DUnit2, DUnitX Vgrajen v Delphi Samodejno izvajanje testov
Od teorije k praksi …
Mocking
Odvisni razredi
Lažni razredi
Dependency Injection Inversion of Control (IoC) Običajno: Razred izdela primerke razredov, ki jih uporablja Obrnjeno (IoC): Razredu nastavimo (injection) primerke razredov, ki jih uporablja
Primer type ILogger = interface procedure Log(const msg: string); end; TTestedClass = class strict private FLogger: ILogger; public property Logger: ILogger read FLogger write FLogger;
Delphi Mocks Vincent Parrett (DUnitX) https://github.com/VSoftTechnologies/Delphi-Mocks Avtomatska izdelava lažnih razredov TStub TMock Osnovano na vmesnikih + RTTI
Preizkušamo lahko tudi drugače
Načini preizkušanja Preizkušanje enot Integracijsko preizkušanje Regresijsko preizkušanje Aplikacijsko preizkušanje TestComplete DUnit + OpenCTF DUnit2
Vprašanja?