Unit-Testing Presented by Benny Pasternak November 2005 Program testing can be used to show the presence of bugs, but never to show their absence! - Edsger.

Slides:



Advertisements
Similar presentations
Numbers Treasure Hunt Following each question, click on the answer. If correct, the next page will load with a graphic first – these can be used to check.
Advertisements

1 Senn, Information Technology, 3 rd Edition © 2004 Pearson Prentice Hall James A. Senns Information Technology, 3 rd Edition Chapter 7 Enterprise Databases.
Adders Used to perform addition, subtraction, multiplication, and division (sometimes) Half-adder adds rightmost (least significant) bit Full-adder.
EE384y: Packet Switch Architectures
Zhongxing Telecom Pakistan (Pvt.) Ltd
1
Distributed Systems Architectures
Chapter 7 System Models.
Chapter 7 Constructors and Other Tools. Copyright © 2006 Pearson Addison-Wesley. All rights reserved. 7-2 Learning Objectives Constructors Definitions.
Copyright © 2003 Pearson Education, Inc. Slide 1 Computer Systems Organization & Architecture Chapters 8-12 John D. Carpinelli.
1 Copyright © 2013 Elsevier Inc. All rights reserved. Chapter 4 Computing Platforms.
Processes and Operating Systems
Copyright © 2011, Elsevier Inc. All rights reserved. Chapter 6 Author: Julia Richards and R. Scott Hawley.
1 Copyright © 2013 Elsevier Inc. All rights reserved. Chapter 3 CPUs.
1 Hyades Command Routing Message flow and data translation.
Business Transaction Management Software for Application Coordination 1 Business Processes and Coordination. Introduction to the Business.
Introduction to Algorithms 6.046J/18.401J
1 Introducing the Specifications of the Metro Ethernet Forum MEF 19 Abstract Test Suite for UNI Type 1 February 2008.
1 RA I Sub-Regional Training Seminar on CLIMAT&CLIMAT TEMP Reporting Casablanca, Morocco, 20 – 22 December 2005 Status of observing programmes in RA I.
Properties of Real Numbers CommutativeAssociativeDistributive Identity + × Inverse + ×
Process a Customer Chapter 2. Process a Customer 2-2 Objectives Understand what defines a Customer Learn how to check for an existing Customer Learn how.
Custom Statutory Programs Chapter 3. Customary Statutory Programs and Titles 3-2 Objectives Add Local Statutory Programs Create Customer Application For.
Chapter 5 Input/Output 5.1 Principles of I/O hardware
1 Click here to End Presentation Software: Installation and Updates Internet Download CD release NACIS Updates.
Turing Machines.
Red Tag Date 13/12/11 5S.
13 Copyright © 2005, Oracle. All rights reserved. Monitoring and Improving Performance.
Software testing.
PP Test Review Sections 6-1 to 6-6
Data Structures Using C++
Double-Linked Lists and Circular Lists
EIS Bridge Tool and Staging Tables September 1, 2009 Instructor: Way Poteat Slide: 1.
Chapter 4 Gates and Circuits.
Health Artifact and Image Management Solution (HAIMS)
Bellwork Do the following problem on a ½ sheet of paper and turn in.
CS 6143 COMPUTER ARCHITECTURE II SPRING 2014 ACM Principles and Practice of Parallel Programming, PPoPP, 2006 Panel Presentations Parallel Processing is.
Operating Systems Operating Systems - Winter 2010 Chapter 3 – Input/Output Vrije Universiteit Amsterdam.
Copyright © 2012, Elsevier Inc. All rights Reserved. 1 Chapter 7 Modeling Structure with Blocks.
Success with ModelSmart3D Pre-Engineering Software Corporation Written by: Robert A. Wolf III, P.E. Copyright 2001, Pre-Engineering Software Corporation,
1 RA III - Regional Training Seminar on CLIMAT&CLIMAT TEMP Reporting Buenos Aires, Argentina, 25 – 27 October 2006 Status of observing programmes in RA.
Basel-ICU-Journal Challenge18/20/ Basel-ICU-Journal Challenge8/20/2014.
1..
Database System Concepts and Architecture
CONTROL VISION Set-up. Step 1 Step 2 Step 3 Step 5 Step 4.
Adding Up In Chunks.
Chapter 10 Software Testing
Page 1 of 43 To the ETS – Bidding Query by Map Online Training Course Welcome This training module provides the procedures for using Query by Map for a.
1 Processes and Threads Chapter Processes 2.2 Threads 2.3 Interprocess communication 2.4 Classical IPC problems 2.5 Scheduling.
Global Analysis and Distributed Systems Software Architecture Lecture # 5-6.
1 hi at no doifpi me be go we of at be do go hi if me no of pi we Inorder Traversal Inorder traversal. n Visit the left subtree. n Visit the node. n Visit.
Systems Analysis and Design in a Changing World, Fifth Edition
Lilian Blot CORE ELEMENTS SELECTION & FUNCTIONS Lecture 3 Autumn 2014 TPOP 1.
Chapter 12 Working with Forms Principles of Web Design, 4 th Edition.
Essential Cell Biology
PSSA Preparation.
Chapter 11 Component-Level Design
Chapter 11 Creating Framed Layouts Principles of Web Design, 4 th Edition.
Essential Cell Biology
Immunobiology: The Immune System in Health & Disease Sixth Edition
 2003 Prentice Hall, Inc. All rights reserved. 1 Chapter 13 - Exception Handling Outline 13.1 Introduction 13.2 Exception-Handling Overview 13.3 Other.
Energy Generation in Mitochondria and Chlorplasts
3D Analysis with AASHTOWare Bridge Design and Rating
From Model-based to Model-driven Design of User Interfaces.
User Defined Functions Lesson 1 CS1313 Fall User Defined Functions 1 Outline 1.User Defined Functions 1 Outline 2.Standard Library Not Enough #1.
1 Decidability continued…. 2 Theorem: For a recursively enumerable language it is undecidable to determine whether is finite Proof: We will reduce the.
© Copyright 2011 John Wiley & Sons, Inc.
Chapter 9: Using Classes and Objects. Understanding Class Concepts Types of classes – Classes that are only application programs with a Main() method.
CS223: Software Engineering Lecture 19: Unit Testing.
Unit Test Pattern.
Presentation transcript:

Unit-Testing Presented by Benny Pasternak November 2005 Program testing can be used to show the presence of bugs, but never to show their absence! - Edsger Dijkstra, [1972]

2 Agenda Introduction – Definition – Why bother? – eXtreme Unit Testing Unit Test Patterns Some Best practices Testing Frameworks Conclusion

3 Definitions testing of individual hardware or software units or groups of related units [IEEE 90] a method of testing the correctness of a particular module of source code [Wiki]

4 Why even bother? Tests Reduce Bugs in New Features Tests Reduce Bugs in Existing Features Tests Are Good Documentation Tests Reduce the Cost of Change Tests Improve Design Tests Allow Refactoring

5 Why even bother? (continued) Tests Constrain Features Tests Defend Against Other Programmers Testing Is Fun Testing Forces You to Slow Down and Think Testing Makes Development Faster Tests Reduce Fear

6 eXtreme Unit Testing - Principles Use a unit test framework All classes should be tested Create tests first - Code is added only when a tests breaks Unit tests are released into the code repository along with the code they test. (code without one may not be released) Upon discovering a missing unit test it must be created at that time

7 eXtreme Unit Testing - Benefits Enable collective code ownership Guard your functionality from being accidently harmed Requiring all code to pass all tests ensures all functionality always works. Enable refactoring Enable frequent integration Tests before code – solidifies requirements

8 Unit Test Patterns – Why? All tools have their supporters and protestors As any tool it might be shelved one day as yet another programming tool To change this fate, it has to be embraced by both community and tool developers In order to do so, it must be formalized into a real engineering discipline rather than an ad hoc approach

9 Unit Testing Patterns pass/fail patterns collection management patterns data driven patterns performance patterns simulation patterns multithreading patterns stress test patterns presentation layer patterns process patterns

10 Pass/Fail Patterns First line of defense to guarantee good code Simple-Test Pattern Code-Path Pattern Parameter-Range Pattern

11 Simple Test-Pattern Pass/Fail results tell us that the code under test will work/trap an error given the same input (condition) as in the unit test No real confidence that the code will work correctly or trap errors with other set of conditions

12 Code-Path Pattern Emphasizes on conditions that test the code paths with in the unit rather than conditions that test for pass/fail Results are compared to expected output of given code path Caveat: How do you test code-paths if tests are written first?

13 Parameter-Range Pattern Code-Path pattern with more than a single parameter test

14 Data Driven Test Patterns Patterns which enable testing units with a broad range of input, output pairs Simple-Test-Data Pattern Data-Transformation-Test Pattern

15 Simple-Test-Data Pattern Reduces complexity of Parameter-Range unit by separating test data from the test. Test data is generated and modified independent of the test Results are supplied with the data set. Variances in the result are not permitted Candidates for this pattern: Checksum Calculations, mathematical algorithims, etc…

16 Data-Transformation-Test Pattern Works with data in which a qualitive measure of the result must be performed. Typically applied to transformation algorithms such as lossy compression

17 Data Transaction Patterns Patterns embracing issues of data persistence and communication Simple-Data-I/O Pattern Constraint Data Pattern The Rollback Pattern

18 Simple-Data-I/O Pattern Verifies the read/write functions of the service

19 Constraint Data Pattern Adds robustness to Simple-Data-I/O pattern by testing more aspects pf the service and any rules that the service may incorporate Unit test verifies the service implementation itself, whether a DB schema, web service, etc…

20 Rollback Pattern Verifies rollback correctness Most transactional unit tests should incorporate ability to rollback dataset to known state, in order to undo test side effects

21 Collection Management Patterns Used to verify that the code is using the correct collection Collection-Order Pattern Enumeration Pattern Collection-Constraint Pattern Collection-Indexing Pattern

22 Collection-Order Pattern Verifies expected results when given an unordered list The test validates that the result is as expected: unordered, ordered or same sequence as input Provides implementer with information on how the container manages the collections

23 Enumeration Pattern Verifies issues of enumeration or collection traversal Important test when connections are non-linear. i.e. collection tree nodes Edge conditions (past first or last item) are also important to test

24 Collection-Constraint Pattern Verifies that the container handles constraint violations: null values and duplicate keys Typically applies to key-value pair collections

25 Collection-Indexing Pattern Verifies and documents indexing methods that the collection must support – by index and/or by key Verifies that update and delete transactions that utiilize indexing are working properly and are protected against missing indexes

26 Performance Patterns Used to test non functional requirements as performance and resource usage Performance-Test Pattern

27 Performance-Test Pattern Types of performance that can be measured: Memory usage (physical, cache, virtual) Resource (handle) utilization Disk utilization (physical, cache) Algorithm Performance (insertion, retrieval)

28 Simulation Patterns Used to verify that the code is using the correct collection Mock-Object Pattern Service-Simulation Pattern Bit-Error-Simulation Pattern Component-Simulation Pattern

29 Mock-Object Pattern Classes need to be abstracted, objects must be constructed in factories, facades and bridges need to be used to support abstraction Alternatively, AOP practices can be used to establish a pointcut

30 Service-Simulation Pattern Test simulates connection and I/O method of a service Useful when developing large applications in which functional pieces are yet to be implemented

31 Component-Simulation Pattern Mock object simulates a component failure, such as network cable, hub or other device After a suitable time, the mock object can do a variety of things: – Thrown an exception – Returns incomplete of completely missing data – Return a timeout error

32 Multithreading Patterns In order to perform many threading tests correctly, the unit tester must itself execute tests as separate threads. Signaled Pattern Deadlock-Resolution Pattern

33 Signaled Pattern This test verifies that a worker thread eventually signals the main thread or another thread

34 Deadlock-Resolution Pattern Verifies that dead locks are resolved

35 Stress-Test Patterns Verify units performance under stress Bulk-Data-Stress-Test Pattern Resource-Stress-Test Pattern Loading-Test Pattern

36 Bulk-Data-Stress-Test Pattern Designed to validate performance of data manipulation when working with large data sets Will reveal inefficencies in insertion, access Typically corrected by reviewing indexing, constrains, reexamining if code should be client or server side

37 Resource-Stress-Test Pattern Depends on the features of the operating system (may be served by using mock objects) If not supported by OS, mock objects must be used to simulate the response of the operating system under a low resource condition

38 Loading-Test Pattern Measures behavior of the code when another machine, application, or thread is loading the system (i.e. high CPU usage or network traffic) Ideally, a unit test simulating high volume of network traffic would create a thread to inject packets onto the network

39 Presentation Layer Patterns 1. Verify that information is getting to the user right at the presentation layer itself 2. The internal workings of the application are correctly setting presentation layer state. View-State Test Pattern Model-State Test Pattern

40 Process Patterns A process is just a different type of unit. Validate state transitions and business rules Process-Sequence Pattern Process-State Pattern Process-Rule Pattern

41 Pattern Summary Unit Test patterns cover broad aspects of development; not just functional May promote unit testing to become a more formal engineering discipline Helps identify the kind of unit tests to write, and its usefulness. Allows developer to choose how detailed the unit tests need to be

42 Some Best Practices 1. Naming standards for unit tests 2. Test coverage and testing angles 3. When should a unit test be removed or changed? 4. Tests should reflect required reality 5. What should assert messages say? 6. Avoid multiple asserts in a single unit test 7. Mock Objects Usage 8. Making tests withstand design and interface changes – remove code duplication

43 Naming standards for unit tests Test name should express a specific requirement Test name should include the expected input or state and the expected result output or state Test name should include name of tested method or class Example: Given method: Public int Sum(params int[] values) with requirement to ignore numbers > 1000 in the summing Process Then test name should be Sum_NumberIgnoredIfBiggerThan1000

44 Test coverage and testing angles Q: How can one check if a unit test has good coverage over the tested code? A: Try removing a line or a constraint check. Example: Public int Sum (int x,int y, bool allowNegatives) { if { if (x<0 || y<0) throw exception; } return x+y; } (!allowNegatives) (! true )

45 When should a test be changed or removed? Generally, a passing test should never be removed. They make sure that code changes dont break working code. A passing test should only be changed to make it more readable. When failing tests dont pass, it usually means there are conflicting requirements: Example: [ExpectedException(typeof(Exception),Negatives not allowed)] Void Sum_Negative1stNumberThrowsException() { Sum (-1,1,2); } New features allows negative numbers.

46 When should a test be changed or removed? New developer writes the following test: Void Sum_Negative1stNumberCalculatesCorrectly() { Int sumResult = sum(-1,1,2); Assert.AreEqual(2,sumResult); } Earlier test fails due to a requirement change – its no longer valid Two course of actions: 1. Delete the failing test after verifying that its not valid 2. Change the old test: 1. Either testing the new requirement 2. Or to test the older requirement under new settings

47 Tests should reflect required reality Example: Int Sum(int a,int b) – returns sum of a & b Whats wrong with the following test? Public void Sum_AddsOneAndTwo() { int result = Sum(1,2); Assert.AreEqual(4, result, bad sum); } Common mistake is to confuse the Fail first requirement with Fail by testing something illogical A failing test should prove that there is something wrong with the production code and not the unit test code

48 What should assert messages say? Assert message in a test is one of the most important things. Tells us what we expected to happen but didnt, and what happened instead Good assert message helps us track bugs and understand unit tests more easily DO: – Express what should have happened and what did not happen Foo should have thrown an exception Fodd didn not throw any exception Foo should have returned a new ID Foo did not open the connection before returning it DONT: Provide empty or meaningless messages Provide messages that repeat the name of the test case Provide messages that simply state the test inputs

49 Avoid multiple asserts in a single unit test Consider the following test: Void Sum_AnyParamBiggerThan1000IsNotSummed() { Assert.AreEqual(3, Sum(1001,1,2); Assert.AreEqual(3, Sum(1,1001,2); Assert.AreEqual(3, Sum(1,2,1001); } Disadvantages of multiple asserts in one test case: If the first assert fails, the test execution stops for this test case. Favor failure of multiple tests over a failure of one test with multiple asserts Affect future coders to add assertions to test rather then introducing a new one

50 Mock Objects Usage Q: When should mock objects be used? A: Mock objects are used when one needs to replace or remove dependencies from code under test For example class LoginManager manages user logins with the following responsibility: When login fails, class reports to a logger class or class The unit test should test the class logic without having to configure or rely on the availability of the logger class or class So we replace the logger class with a fake one which can also mimic various scenarios of failures which are hard to recreate in real life

51 Making tests withstand design and interface changes – remove code duplication Re-design is a major pitfall developers writing unit tests might face. A sudden design change – removal of a default constructor, new parameters added, etc… - might break many of the unit tests that have already been written. All hell breaks loose and the developer starts fixing hundreds of tests. Guidelines to prevent the scenario described above: Encapsulate object creation code Encapsulate complex or lengthy object initialization code Apply these helper methods only when duplicate code across the tests is detected

52 Unit Testing Frameworks JUnit - First Unit Testing Framework developed by Erich Gamma and Kent Beck Since then Unit Testing Frameworks have been developed for a broad range of computer languages. List of xUnit frameworks can be found at:

53 NUnit - Features Test code is annotated using custom Attributes Test code contains Assertions Supports Configuration Files Tests organized as Multiple Assemblies

54 NUnit – Attribute Listing – [TestFixture] – [TestFixtureSetUp] – [TestFixtureTearDown] – [Test] – [SetUp] – [TearDown] – [ExpectedException(typeof(Exception))] – [Ignore(message)]

55 NUnit – Attributes [TestFixture] - This attribute marks a class that contains tests, and, optionally, setup or teardown methods [Test] - The Test attribute marks a specific method inside a class that has already been marked as a TestFixture, as a test method [TestFixtureSetUp] - Used to indicate a setup method that will be ran once; before all other tests. This is the first method that is called before the tests are started [TestFixtureTearDown] - Used to indicate a tear down method that will be ran once; after all other tests have run. This is the last method that is called after all the tests have finished.

56 NUnit – Attributes [SetUp] - Used to indicate a setup method should be ran before each of the tests [TearDown] - Used to indicate a tear down method should be ran after each of the tests are ran [ExpectedException(typeof(Exception))] – – When you want an exception to be thrown – Will only pass if exception type was throw [Ignore(Not ready for primetime)] - Used when a test is not ready, or you dont want the test to be ran

57 NUnit - Example Class: namespace bank { public class Account { private float balance; public void Deposit(float amount) { balance+=amount; } public void Withdraw(float amount) { balance-=amount; } public void TransferFunds(Account destination, float amount) { } public float Balance { get{ return balance;} }

58 NUnit - Example Test: namespace bank { using NUnit.Framework; [TestFixture] public class AccountTest { [Test] public void TransferFunds() { Account source = new Account(); source.Deposit(200.00F); Account destination = new Account(); destination.Deposit(150.00F); source.TransferFunds(destination, F); Assert.AreEqual(250.00F, destination.Balance); Assert.AreEqual(100.00F, source.Balance); }

59 NUnit – Screen Shots

60 NUnit – Screen Shots

61 NUnit – Screen Shots

62 NUnit – Screen Shots

63 Summary The concept of Unit Testing has been around for many years New methodologies in particular XP, have turned unit testing into a cardinal foundation of software development. Writing good & effective Unit Tests is hard! This is where supporting integrated tools and suggested guidelines enter the picture. The ultimate goal is tools that generate unit tests automatically

64 Refrences Advanced Unit Test, Part V - Unit Test Patterns by Mark Clifton asp#Introduction0 Best Practices aspx?Show=All