Unit Testing
Unit Testing
Unit Testing
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 1
Outline of the Chapter
• Concept of Unit Testing
• Static Unit Testing
• Defect Prevention
• Dynamic Unit Testing
• Mutation Testing
• Debugging
• Unit Testing in eXtreme Programming
• Tools For Unit Testing
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 2
Concept of Unit Testing
• Static Unit Testing
– Code is examined over all possible behaviors that might arise during run
time
– Code of each unit is validated against requirements of the unit by reviewing
the code
• Dynamic Unit Testing
– A program unit is actually executed and its outcomes are observed
– One observe some representative program behavior, and reach conclusion
about the quality of the system
• Static unit testing is not an alternative to dynamic unit testing
• Static and Dynamic analysis are complementary in nature
• In practice, partial dynamic unit testing is performed concurrently
with static unit testing
• It is recommended that static unit testing be performed prior to the
dynamic unit testing
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 3
Static Unit Testing
• In static unit testing code is reviewed by applying techniques:
– Inspection: It is a step by step peer group review of a work product, with each
step checked against pre-determined criteria
– Walkthrough: It is review where the author leads the team through a manual
or simulated executed of the product using pre-defined scenarios
• The idea here is to examine source code in detail in a systematic
manner
• The objective of code review is to review the code, and not to
evaluate the author of the code
• Code review must be planned and managed in a professional manner
• The key to the success of code is to divide and conquer
– An examiner inspect small parts of the unit in isolation
• nothing is overlooked
• the correctness of all examined parts of the module implies the
correctness of the whole module
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 4
Static Unit Testing (Code Review)
• Step 1: Readiness
– Criteria
• Completeness
• Minimal functionality
• Readability
• Complexity
• Requirements and design
documents
– Roles
• Moderator
• Author
• Presenter
• Record keeper
• Reviewers
• Observer
• Step 2: Preparation
– List of questions
– Potential Change Request (CR)
– Suggested improvement opportunities Figure 3.1: Steps in the code review process
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 5
Static Unit Testing (Code Review)
• Step 3: Examination A Change Request (CR) includes the
– The author makes a presentation following details:
– The presenter reads the code – Give a brief description of the issue
– The record keeper documents the CR – Assign a priority level (major or
minor) to a CR
– Moderator ensures the review is on
track – Assign a person to follow it up
• Step 4: Re-work – Set a deadline for addressing a CR
– Make the list of all the CRs
– Make a list of improvements
– Record the minutes meeting
– Author works on the CRs to fix the
issue
• Step 5: Validation
– CRs are independently validated
• Step 6: Exit
– A summary report of the meeting
minutes is distributes
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 6
Static Unit Testing (Code Review)
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 7
Static Unit Testing (Code Review)
• The code review methodology can be applicable to review other documents
• Five different types of system documents are generated by engineering department
– Requirement
– Functional Specification
– High-level Design
– Low-level Design
– code
• In addition installation, user, and trouble shooting guides are developed by
technical documentation group
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 10
Dynamic Unit Testing
Selection of test data is broadly based on the following techniques:
• Control flow testing
– Draw a control flow graph (CFG) from a program unit
– Select a few control flow testing criteria
– Identify a path in the CFG to satisfy the selection criteria
– Derive the path predicate expression from the selection paths
– By solving the path predicate expression for a path, one can generate the data
• Data flow testing
– Draw a data flow graph (DFG) from a program unit and then follow the
procedure described in control flow testing.
• Domain testing
– Domain errors are defined and then test data are selected to catch those faults
• Functional program testing
– Input/output domains are defined to compute the input values that will cause
the unit to produce expected output values
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 11
Mutation Testing
• Modify a program by introducing a single small change to the code
• A modified program is called mutant
• A mutant is said to be killed when the execution of test case cause it
to fail. The mutant is considered to be dead
• A mutant is an equivalent tot the given program if it always produce
the same output as the original program
• A mutant is called killable or stubborn, if the existing set of test
cases is insufficient to kill it
• A mutation score for a set of test cases is the percentage of non-
equivalent mutants killed by the test suite
• The test suite is said to be mutation-adequate if its mutation score is
100%
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 12
Mutation testing
Consider the following program P • Test Case 1:
• main(argc,argv) input: 1 2 3
• int argc, r, i; output: Value of the rank is 3
• char *argv[]; • Test Case 2:
• { r = 1; input: 1 2 1
• for i = 2 to 3 do output: Values of the rank is 2
• if (atoi(argv[i]) > atoi(argv[r])) r = i; • Test Case 3:
• printf(“Value of the rank is %d \n”, r); input: 3 1 2
• exit(0); } output: Value of the rank is 1
Mutant 1: Change line 5 to for i = 1 to 3 do
Mutant 2: Change line 6 to if (i > atoi(argv[r])) r = i;
Mutant 3: Change line 6 to if (atoi(argv[i]) >= atoi(argv[r])) r = i;
Mutant 4: Change line 6 to if (atoi(argv[r]) > atoi(argv[r])) r = i;
Execute modified programs against the test suite, you will get the results:
Mutants 1 & 3: Programs will pass the test suite, i.e., mutants 1 & 3 are not killable
Mutant 2: Program will fail test cases 2
Mutant 1: Program will fail test case 1 and test cases 2
Mutation score is 50%, assuming mutants 1 & 3 non-equivalent
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 13
Mutation testing
• The score is found to be low because we assumed mutants 1 & 3 are nonequivalent
• We need to show that mutants 1 and 3 are equivalent mutants or those are killable
• To show that those are killable, we need to add new test cases to kill these two
mutants
• First, let us analyze mutant 1 in order to derive a “killer” test. The difference
between P and mutant 1 is the starting point
• Mutant 1 starts with i = 1, whereas P starts with i = 2. There is no impact on the
result r. Therefore, we conclude that mutant 1 is an equivalent mutant
• Second, if we add a fourth test case as follows:
Test Case 4:
input: 2 2 1
• Program P will produce the output “Value of the rank is 1” and mutant 3 will
produce the output “Value of the rank is 2”
• Thus, this test data kills mutant 3, which give us a mutation score 100%
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 14
Mutation Testing
Mutation testing makes two major assumptions:
• Coupling effects
– Complex faults are coupled to simple faults in such a way that a test suite
detecting simple faults in a program will detect most of the complex faults
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 15
Debugging
• The process of determining the cause of a failure is known as
debugging
• It is a time consuming and error-prone process
• Debugging involves a combination of systematic evaluation,
intuition and a little bit of luck
• The purpose is to isolate and determine its specific cause, given a
symptom of a problem
• There are three approaches to debugging
– Brute force
– Cause elimination
• Induction
• Deduction
– Backtracking
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 16
Unit Testing in eXtreme Programming
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 17
Unit Testing in eXtreme Programming
Three laws of Test Driven development (TDD)
• One may not write production code unless the first failing unit test is
written
• One may not write more of a unit test than is sufficient to fail
• One may not write more production code than is sufficient to make
the failing unit test pass
Pair programming:
– In XP code is being developed by two programmers working side by side
– One person develops the code tactically and the other one inspects it
methodically by keeping in mind the story they are implementing
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 18
JUnit – A Framework for Unit Testing
• JUnit: It is a framework for performing unit testing of Java
programs.
– Other frameworks: NUnit (C#), CPPUnit (C++), fUnit (Fortran)
• Intuitive steps to test a method in Java (Ex. Move() method of
PlanetClass)
– Create an object instance of PlanetClass. Call it Mars.
– Select values of all input parameters of Move().
– Compute the expected value to be returned by Move(). Let it be y.
– Execute method Move() on Mars with the selected input values.
• Let Move() return a value called z.
– Compare the actual output (z) returned by Move() with the expected value
(y).
• If (z == y), Move() passes the test; otherwise it fails. Report the
result.
• JUnit makes writing of test cases easier. Next slide …
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 19
JUnit – A Framework for Unit Testing
• JUnit provides a basic class called TestCase.
• The tester
– Extends the TestCase class for each test case. 10 extensions for 10 test
cases.
– Alternatively, extend TestCase to have 10 methods for 10 test cases.
• The TestCase class provides methods to make assertions.
– assertTrue(Boolean condition)
– assertFalse(Boolean condition)
– assertEquals(Object expected, Object actual)
– assertEquals(int expected, int actual)
– assertEquals(double expected, double actual, double tolerance)
– assertSame(Object expected, Object actual)
– assertNull(Object testobject)
– …
• The tester can have her own assertions.
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 20
JUnit – A Framework for Unit Testing
• Each assertion accepts an optional first parameter of type String; if
the assertion fails, the string is displayed. Help for the tester…
• The assertEquals() method displays a message upon failure.
• junit.framework.AssertionFailedError: expected: <x> but
was: <y>
• Note that only failed tests are reported.
• The following shows how assertTrue() works.
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 21
JUnit – A Framework for Unit Testing
import TestMe; // TestMe is the class whose methods are going to be tested.
import junit.framework.*; // This contains the TestCase class.
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 24
Tools for Unit Testing
• Software inspection support
– Tools can help schedule group inspection
• Test coverage analyzer
– These tools measure internal test coverage, often expressed in terms of control
structure of the test object, and report the coverage metric
• Test data generator
– These tools assist programmers in selecting test data that cause program to
behave in a desired manner
• Test harness
– This class of tools support the execution of dynamic unit tests
• Performance monitors
– The timing characteristics of the software components be monitored and
evaluate by these tools
• Network analyzers
– These tools have the ability to analyze the traffic and identify problem areas
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 25
Tools for Unit Testing
• Simulators and emulators
– These tools are used to replace the real software and hardware that are not
currently available. Both the kinds of tools are used for training, safety, and
economy purpose
• Traffic generators
– These produces streams of transactions or data packets.
• Version control
– A version control system provides functionalities to store a sequence of
revisions of the software and associated information files under development
Software Testing and QA Theory and Practice (Chapter 3: Unit Testing) © Naik & Tripathy 26