210 likes | 310 Views
Unit Testing. Building Rock-Solid Software. Svetlin Nakov. Telerik Software Academy. http://academy.telerik.com. Manager Technical Training. http://www.nakov.com. What is Unit Testing?. Unit Test – Definition.
E N D
Unit Testing Building Rock-Solid Software Svetlin Nakov Telerik Software Academy http://academy.telerik.com Manager Technical Training http://www.nakov.com
Unit Test – Definition A unit test is a piece of code written by a developer that exercises a very small, specific area of functionality of the code being tested. “Program testing can be used to show the presence of bugs, but never to show their absence!” Edsger Dijkstra, [1972]
Unit Test – Example int sum(int[] array) { int sum = 0; for (int i=0; i<array.length; i++) sum += array[i]; return sum; } void testSum() { if (sum(new int[]{1,2}) != 3) throw new TestFailedException("1+2 != 3"); if (sum(new int[]{-2}) != -2) throw new TestFailedException("-2 != -2"); if (sum(new int[]{}) != 0) throw new TestFailedException("0 != 0"); }
Unit Testing – Some Facts • Tests are pieces of code (small programs) • In most cases unit tests are written by developers, not by QA engineers • Unit tests are released into the code repository (TFS / SVN / Git) along with the code they test • Unit testing framework is needed • Visual Studio Team Test (VSTT) • NUnit, MbUnit, Gallio, etc.
Unit Testing Frameworks • JUnit • The first popular unit testing framework • Based on Java, written by Kent Beck & Co. • Similar frameworks have been developed for a broad range of computer languages • NUnit– for C# and all .NET languages • cppUnit, jsUnit, PhpUnit, PerlUnit, ... • Visual Studio Team Test (VSTT) • Developed by Microsoft, integrated in VS
JUnit – the first unit testing framework www.junit.org Based on Java Developed by Erich Gamma and Kent Beck Unit testing frameworks have been developed for a broad range of computer languages NUnit – for C#, VB.NET and .NET languages cppUnit, DUnit, jsUnit, PhpUnit, PerlUnit, ... List of xUnit frameworks can be found at: http://www.testingfaqs.org/t-unit.html Unit Testing Frameworks
Test code is annotated using Java 5 annotations Test code contains assertions Tests are grouped in test fixtures and test suites Several execution interfaces Eclipse integrated plug-in Console interface: JUnit – Features java org.junit.runner.JUnitCore <test-class>
JUnit– Annotations • @Test • Annotates a test case method • @Before, @After • Annotates methods called before/after each test case • @BeforeClass, @AfterClass • Annotates methods called one time before and after all test cases in the class • @Ignore • Ignores a test case
Usingorg.junit.Assertclass Assertions check a condition and throw exception if the condition is not satisfied Comparing values assertEquals ([message], expected value, calculated value) Comparing objects assertNull([message], object) assertNotNull([message], object) assertSame ([message], expected obj, calculated obj) JUnit – Assertions
Conditions assertTrue(condition) assertFalse(condition) Forced test fail fail() Expecting exception @Test(expected=IndexOutOfBoundsException.class) JUnit – Assertions (2)
Java class that needs unit testing: JUnit – Example public class Sumator { public int sum(int a, int b) { int sum = a + b; return sum; } public int sum(int... nums) { int sum = 0; for (int i = 0; i < nums; i++) sum += nums[i]; return sum; } }
JUnitbased test class (fixture): JUnit – Example import org.junit.Test; import static org.junit.Assert.*; public class SumatorTest { @Test public void testSum() { Sumator sumator = new Sumator(); int sum = sumator.sum(new int[] {2,3,4}); assertEquals(sum, 9); } }
JUnittext fixture with setup and cleanup: JUnit – Example public class SumatorTest { private Sumator sumator; @Before public void setUpTestCase() { this.sumator = new Sumator(); } @Test public void testSum() { int sum = sumator.sum(2, 3); assertEquals(sum, 5); } @After public void cleanUpTestCase() { this.sumator = null; } }
Suits are sets of JUnittest classes We can define test suits with annotations: Test Suites import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(value=Suite.class) @SuiteClasses(value={Test1.class, Test2.class}) public class AllTests { }
Eclipse has built-in support for integration with JUnit Can create, run and debug JUnittests Eclipse and JUnit
Testing with JUnit Live Demo
Unit Testing http://academy.telerik.com
Free Trainings @ Telerik Academy • C# Programming @ Telerik Academy • csharpfundamentals.telerik.com • Telerik Software Academy • academy.telerik.com • Telerik Academy @ Facebook • facebook.com/TelerikAcademy • Telerik Software Academy Forums • forums.academy.telerik.com