Unit Testing Concepts and Best Practices
-
Upload
derek-smith -
Category
Technology
-
view
16.255 -
download
0
description
Transcript of Unit Testing Concepts and Best Practices
![Page 1: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/1.jpg)
Unit Testing
Concepts, Tools and Best Practices
![Page 2: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/2.jpg)
“I don’t have time to write tests because I am too busy debugging.”
![Page 3: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/3.jpg)
![Page 4: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/4.jpg)
![Page 5: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/5.jpg)
Types of Software TestingUnit Testing (do the parts perform correctly alone?)
Integration Testing (do the parts perform correctly together?)User Acceptance Testing (does the system meet the end user’s expectations?)
![Page 6: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/6.jpg)
The Concept of Unit Testing A unit test is code written by a developer that
tests as small a piece of functionality (the unit) as possible.
One function may have multiple unit tests according to the usage and outputs of the function.
Tests ensure The code meets expectations and specifications:
Does what it says it should do. The code continues to meet expectations over
time: Avoiding regression.
![Page 7: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/7.jpg)
Unit Testing Tools
Production Code
Unit Test Code
Test Runner
![Page 8: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/8.jpg)
Unit Testing Tools Testing Frameworks
NUnit Test Runner
GUI Command line
Automation CruiseControl.NET
![Page 9: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/9.jpg)
Unit Test Hierarchy
Test ProjectTest
Fixture
Test
Test
Test
Test
Test Fixture
Test
Test
Test
Test
One per assembly
One per class
One per unit (not necessarily per method)
![Page 10: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/10.jpg)
Structure of A Unit Test Setup Prepare an input Call a method Check an output Tear down
![Page 11: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/11.jpg)
Test Assertions Assertions are the ‘checks’ that you may
perform to determine if a test passes or fails. For instance:
Assert.IsTrue() Assert.IsInstance() Assert.AreEqual()
Generally speaking, you want ONE assertion per test.
![Page 12: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/12.jpg)
Unit Testing vs. Integration Testing
Business
Entity
Data Layer
Data Access Layer
User Interfa
ce
Unit Testing tests one layer
Integration Testing tests across layers.
![Page 13: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/13.jpg)
Unit Testing with Mocks
Business
Entity
Data Layer
Data Access Layer
Unit Testing tests one layer
A Mock allows a dependency to be imitated so the Unit test can be isolated.
![Page 14: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/14.jpg)
Executing TestsManually:1. Compile Test project (to .dll or .exe)2. Open in Test runner.3. Select and execute tests.
Automatically:4. Build server compiles and runs tests as part
of nightly build operation.5. Any test failures = entire build fails.
![Page 15: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/15.jpg)
Sample Unit Test
![Page 16: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/16.jpg)
Best Practices
![Page 17: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/17.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 18: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/18.jpg)
Consistent Multiple runs of the test should consistently
return true or consistently return false, provided no changes were made on code
Code that can cause problems:
Dim currentDate as Date = Now()
Dim value as Integer = New Random().Next
![Page 19: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/19.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 20: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/20.jpg)
Atomic Only two possible results: PASS or FAIL No partially successful tests.
Isolation of tests: Different execution order must yield same results. Test B should not depend on outcome of Test A
Use Mocks instead.
![Page 21: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/21.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single
Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 22: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/22.jpg)
Single Responsibility One test should be responsible for one
scenario only.
Test behavior, not methods: One method, multiple behaviors Multiple tests One behavior, multiple methods One test
![Page 23: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/23.jpg)
Single ResponsibilitySub TestMethod()
Assert.IsTrue(behavior1)
Assert.IsTrue(behavior2)
Assert.IsTrue(behavior3)
End Sub
Sub TestMethodCheckBehavior1()
Assert.IsTrue(behavior1)
End Sub
Sub TestMethodCheckBehavior2()
Assert.IsTrue(behavior2)
End Sub
Sub TestMethodCheckBehavior3()
Assert.IsTrue(behavior3)
End Sub
![Page 24: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/24.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 25: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/25.jpg)
Self Descriptive Unit test must be easy to read and understand
Variable Names Method Names Class Names No conditional logic No loops
Name tests to represent PASS conditions: Public Sub CanMakeReservation() Public Sub TotalBillEqualsSumOfMenuItemPrices()
Self descriptive
![Page 26: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/26.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional
logic or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 27: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/27.jpg)
No conditional logic or loops Test should have no uncertainty:
All inputs should be known Method behavior should be predictable Expected output should be strictly defined Split in to two tests rather than using “If” or “Case”
Tests should not contain “While”, “Do While” or “For” loops. If test logic has to be repeated, it probably means
the test is too complicated. Call method multiple times rather than looping
inside of method.
![Page 28: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/28.jpg)
No conditional logic or loopsSub TestBeforeOrAfter()
If before Then
Assert.IsTrue(behavior1)
ElseIf after Then
Assert.IsTrue(behavior2)
Else
Assert.IsTrue(behavior3)
End If
End Sub
Sub TestBefore()
Dim before as Boolean = true
Assert.IsTrue(behavior1)
End Sub
Sub TestAfter()
Dim after as Boolean = true
Assert.IsTrue(behavior2)
End Sub
Sub TestNow()
Dim before as Boolean = false
Dim after as Boolean = false
Assert.IsTrue(behavior3)
End Sub
![Page 29: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/29.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 30: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/30.jpg)
No Exception Handling Indicate expected exception with attribute. Catch only the expected type of exception. Fail test if expected exception is not caught. Let other exceptions go uncaught.
![Page 31: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/31.jpg)
No Exception Handling
<ExpectedException(“MyException”)> _
Sub TestException()
myMethod(parameter)
Assert.Fail(“MyException expected.”)
End Sub
![Page 32: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/32.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 33: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/33.jpg)
Informative Assertion Messages By reading the assertion message, one should
know why the test failed and what to do. Include business logic information in the
assertion message (such as input values, etc.) Good assertion messages:
Improve documentation of the code, Inform developers about the problem if the test
fails.
![Page 34: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/34.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 35: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/35.jpg)
No test logic in Production Code Separate Unit tests and Production code in
separate projects. Do not create Methods or Properties used only
by unit tests. Use Dependency Injection or Mocks to isolate
Production code.
![Page 36: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/36.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 37: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/37.jpg)
Separation per Business Module Create separate test project for every layer or
assembly Decrease execution time of test suites by
splitting in to smaller suites Suite 1 - All Factories Suite II - All Controllers
Smaller Suites can be executed more frequently
![Page 38: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/38.jpg)
Unit Test Best Practices1. Consistent2. Atomic3. Single Responsibility4. Self-descriptive5. No conditional logic
or loops
6. No exception handling
7. Informative Assertion messages
8. No test logic in production code
9. Separation per business module
10. Separation per type
![Page 39: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/39.jpg)
Separation per Type Align Test Fixtures with type definitions.
Reminder: Unit tests are separate from integration tests! Different purpose Different frequency Different time of execution Different action in case of failure
![Page 40: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/40.jpg)
![Page 41: Unit Testing Concepts and Best Practices](https://reader036.fdocuments.us/reader036/viewer/2022062405/554fb531b4c9057b298b536d/html5/thumbnails/41.jpg)
Images from Flickr Best practices from www.nickokiss.com