Software Testing Lecture 1. Justin Pearson

Similar documents
Anders Fröberg TDDD80 STORAGE AND TESTING

Testing. UW CSE 160 Winter 2016

Writing better code Loop invariants Correctness. John Edgar 2

Lecture 15 Software Testing

Summer May 11, 2010

Who is our rival? Upcoming. Testing. Ariane 5 rocket (1996) Ariane 5 rocket 3/8/18. Real programmers need no testing!

Introduction to CS 270 Math Foundations of CS

Testing. Prof. Clarkson Fall Today s music: Wrecking Ball by Miley Cyrus

Manuel Oriol, CHCRC-C, Software Testing ABB

Test Driven Development TDD

Warm-Up Problem. Let be a set of well-formed Predicate logic formulas. Let be well-formed Predicate logic formulas. Prove or disprove the following.

Greats Bugs in History

Basic Definitions: Testing

Structural Coverage Analysis for Safety-Critical Code - Who Cares? 2015 LDRA Ltd 1

Testing! The material for this lecture is drawn, in part, from! The Practice of Programming (Kernighan & Pike) Chapter 6!

Announcements. Testing. Announcements. Announcements

C07: Testing and JUnit

Program Validation and Testing

Testing and Debugging Lecture 11

Software Engineering

Program Verification! Goals of this Lecture! Words from the Wise! Testing!

Software Testing: Introduction

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 15 Testing

Programming in the Real World. Dr. Baldassano Yu s Elite Education

Introduction & Formal Methods

Testing! The material for this lecture is drawn, in part, from! The Practice of Programming (Kernighan & Pike) Chapter 6!

Testing. ECE/CS 5780/6780: Embedded System Design. Why is testing so hard? Why do testing?

5) I want to get this done fast, testing is going to slow me down.

Tools for Unit Test - JUnit

Specification-Based Testing 1

Software Testing. Software Testing. Theory, Practise and Reality IBM Corporation

CSE 403: Software Engineering, Fall courses.cs.washington.edu/courses/cse403/16au/ Unit Testing. Emina Torlak

Your Instructor. CSE Content. Notes. Notes. Notes. Summer May 4, 2010

Tools for Unit Test JUnit

2SKILL. Variables Lesson 6. Remembering numbers (and other stuff)...

CS211 Computers and Programming Matthew Harris and Alexa Sharp July 9, Boggle

Software Engineering Testing and Debugging Testing

Test automation / JUnit. Building automatically repeatable test suites

Test automation Test automation / JUnit

Reliable programming

CSCI 1100L: Topics in Computing Lab Lab 11: Programming with Scratch

The Dynamic Typing Interlude

Lecture Transcript While and Do While Statements in C++

No Source Code. EEC 521: Software Engineering. Specification-Based Testing. Advantages

EECS 4313 Software Engineering Testing

Chapter 8 Software Testing. Chapter 8 Software testing

JUnit in EDA Introduction. 2 JUnit 4.3

When Brunel s ship the SS Great Britain was launched into the River Thames, it made such a splash that several spectators on the opposite bank were

Module 10A Lecture - 20 What is a function? Why use functions Example: power (base, n)

Model Checking. Automatic Verification Model Checking. Process A Process B. when not possible (not AI).

Therac-25 radiation therapy machine

CS Lecture 19: Loop invariants

Black Box Testing. EEC 521: Software Engineering. Specification-Based Testing. No Source Code. Software Testing

Principles of Software Construction: Objects, Design, and Concurrency (Part 2: Designing (Sub )Systems)

Object Oriented Software Design - I

Errors. And How to Handle Them

Agile Software Development. Lecture 7: Software Testing

Don t Be the Developer Whose Rocket Crashes on Lift off LDRA Ltd

Formal methods What are they? Uses Tools Application to software development

Text Input and Conditionals

Programming Embedded Systems

Chapter 9. Software Testing

Regression testing. Whenever you find a bug. Why is this a good idea?

Laboratorio di Tecnologie dell'informazione

Unit Testing In Python

Overview. State-of-the-Art. Relative cost of error correction. CS 619 Introduction to OO Design and Development. Testing.

An Introduction to Systematic Software Testing. Robert France CSU

Levels of Testing Testing Methods Test Driven Development JUnit. Testing. ENGI 5895: Software Design. Andrew Vardy

Leveraging Formal Methods Based Software Verification to Prove Code Quality & Achieve MISRA compliance

Automated testing in Agile SW development

Testing, Debugging, and Verification

Outline. software testing: search bugs black-box and white-box testing static and dynamic testing

CPE 101. Overview. Programming vs. Cooking. Key Definitions/Concepts B-1

T H E I N T E R A C T I V E S H E L L

Object-Oriented Design Lecture 5 CSU 370 Fall 2008 (Pucella) Friday, Sep 26, 2008

CS 161 Computer Security. Security Throughout the Software Development Process

Software Design Models, Tools & Processes. Lecture 6: Transition Phase Cecilia Mascolo

Intro to Proving Absence of Errors in C/C++ Code

Foundations, Reasoning About Algorithms, and Design By Contract CMPSC 122

Software Engineering I (02161)

Levels of Testing Testing Methods Test Driven Development JUnit. Testing. ENGI 5895: Software Design. Andrew Vardy

Week - 01 Lecture - 03 Euclid's Algorithm for gcd. Let us continue with our running example of gcd to explore more issues involved with program.

Intro to Programming. Unit 7. What is Programming? What is Programming? Intro to Programming

Lecture 9: July 14, How to Think About Debugging

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Testing. CSE 331 University of Washington. Michael Ernst

Testing, code coverage and static analysis. COSC345 Software Engineering

Analysis of the Test Driven Development by Example

Laboratorio di Tecnologie dell'informazione

CMSC 132: OBJECT-ORIENTED PROGRAMMING II

Decisions, Decisions. Testing, testing C H A P T E R 7

Test First Software Development

Shadows in the graphics pipeline

Formal verification of floating-point arithmetic at Intel

Slide Set 2. for ENCM 335 in Fall Steve Norman, PhD, PEng

Software Quality. Richard Harris

Testing and Debugging

Lecture 2. CS118 Term planner. Refinement. Recall our first Java program. Program skeleton GCD. For your first seminar. For your second seminar

Program Verification. Aarti Gupta

n! = 1 * 2 * 3 * 4 * * (n-1) * n

Transcription:

Software Testing Lecture 1 Justin Pearson 2017 1 / 50

Four Questions Does my software work? 2 / 50

Four Questions Does my software work? Does my software meet its specification? 3 / 50

Four Questions Does my software work? Does my software meet its specification? I ve changed something does it still work? 4 / 50

Four Questions Does my software work? Does my software meet its specification? I ve changed something does it still work? How can I become a better programmer? 5 / 50

The Answer Testing 6 / 50

Software Failures NASA s Mars lander, September 1999, crashed due to a units integration fault cost over $50 million. The MCO MIB has determined that the root cause for the loss of the MCO spacecraft was the failure to use metric units in the coding of a ground software file, Small Forces, used in trajectory models. Specifically, thruster performance data in English units instead of metric units was used in the software application code titled SM FORCES (small forces). A file called Angular Momentum Desaturation (AMD) contained the output data from the SM FORCES software. The data in the AMD file was required to be in metric units per existing software interface documentation, and the trajectory modelers assumed the data was provided in metric units per the requirements. 1 1 ftp://ftp.hq.nasa.gov/pub/pao/reports/1999/mco_report.pdf 7 / 50

Ariane 5 explosion Flight 501, which took place on Tuesday, June 4, 1996, was the first, and unsuccessful, test flight of the European Space Agency s Ariane 5 expendable launch system. Due to an error in the software design (inadequate protection from integer overflow), the rocket veered off its flight path 37 seconds after launch and was destroyed by its automated self-destruct system when high aerodynamic forces caused the core of the vehicle to disintegrate. It is one of the most infamous computer bugs in history. 8 / 50

Exception Handling t r y {...... } c a tch ( A r i t h m e t i c O v e r f l o w ( ) ) {... S e l f D e s t r u c t.... } In fact it was an integration problem. The software module was for Ariane 4 and the programers forgot that the Ariane 5 had a higher initial acceleration and a different mass. 9 / 50

Therac-25 Radiation therapy machine. At least 6 patients where given 100 times the intended dose of radiation. Causes are complex 2 but one cause identified: Inadequate Software Engineering Practices... including: The software should be subject to extensive testing and formal analysis at the module and software level; system testing alone is not adequate. Regression testing should be performed on all software changes. 2 http://sunnyday.mit.edu/papers/therac.pdf 10 / 50

Intel s fdiv bug Some pentiums returned instead of 4195835 3145727 = 1.333739068902037589 4195835 3145727 = 1.333820449136241002 11 / 50

Intel s fdiv bug With a goal to boost the execution of floating-point scalar code by 3 times and vector code by 5 times, compared to the 486DX chip, Intel decided to use the SRT algorithm that can generate two quotient bits per clock cycle, while the traditional 486 shift-and-subtract algorithm was generating only one quotient bit per cycle. This SRT algorithm uses a lookup table to calculate the intermidiate quotients necessary for floating-point division. Intel s lookup table consists of 1066 table entries, of which, due to a programming error, five were not downloaded into the programmable logic array (PLA). When any of these five cells is accessed by the floating point unit (FPU), it (the FPU) fetches zero instead of +2, which was supposed to be contained in the missing cells. This throws off the calculation and results in a less precise number than the correct answer(byte Magazine, March 1995). 12 / 50

Intel s fdiv bug Simple programming error: not getting the loop termination condition correct. Later we ll see that this might of been avoided with testing. 13 / 50

Software Failures These are just some of more spectacular examples. There is a lot of bad software out there. Anything we can do to improve the quality of software is a good thing. Formal methods are hard to implement, but software testing with some discipline can become part of any programmers toolbox. 14 / 50

Testing There are lots of different testing activities. We can t cover them all but they include: Unit Testing: Testing your functions/methods as you write your code. Regression testing: maintaining a possibly large set of test cases that have to passed when ever you make a new release. Integration testing: testing if your software modules fit together. As we learn about software engineering you ll see how different testing can be in different phases of the software engineering process. 15 / 50

Can we test? Program testing can be used to show the presence of bugs, but never to show their absence! Edsger Dijkstra. This is true, but it is no reason to give up on testing. All software has bugs. Anything you do to reduce the number of bugs is a good thing. 16 / 50

Test Driven Development Later on we will look at test driven development which is a programming discipline where you write the tests before you write the code. 17 / 50

What is a Test? A test is simply some inputs and some expected outputs. This simple description hides a lot of complexity. How do I run a test? How do I give inputs to a real-time system or a GUI? How do I know what my code is supposed to do, so that I can work out what the expected outputs are? 18 / 50

Aspects of Testing 1. Test Design 2. Test Automation 3. Test Execution 4. Test Evaluation Very important test execution should be as automated as possible. It should be part of your Makefile. Some systems even automatically run tests when you check in code. 19 / 50

Test Design Writing good tests is hard. It requires knowledge of you problem, and knowledge of common errors. Often a test designer is a separate position in a company. 20 / 50

Test Design Adversarial view of test design: How do I break software? 21 / 50

Test Design Adversarial view of test design: How do I break software? Constructive view of test design: How do I design software tests that improve the software process? 22 / 50

Test Automation Designing good tests is hard. If you don t make running the tests an automated process then people will never run them. There are many automated systems, but you can roll your own via scripting languages. The xunit framework has support in most languages for the automated running of tests. It should be as simple as make tests. 23 / 50

Test Automation There are tools for automatically testing web systems. There are tools for testing GUIs. If you design you software correctly you should decouple as much of the GUI behaviour from the rest of the program as you can. This will not only make your program easier to port to other GUIs it will make it easier to test. Don t forget to include test automation in your compilation process. Consider integrating automated testing into your version management system. 24 / 50

Test Execution You need to think of test execution as separate activity. You have to remember to run the tests. In a large organization this might require some planning. Easy if testing is automated. Hard for some domains e.g. GUI. Very hard in distributed or real time environments. 25 / 50

Test Evaluation My software does not pass some of the tests. Is this good or bad? My software passes all my tests. Can I go home now? Or do I have to design more tests? 26 / 50

Important Terminology and Concepts Validation: The process of evaluation software at the end of software development to ensure compliance with intended usage. Verification: The process of determining whether the products of a given phase of the software development process fulfill the requirements established during the previous phase 27 / 50

Important Terminology and Concepts Software Fault: A static defect in the software Software Error: An incorrect internal state that is the manifestation of some fault Software Failure: External, incorrect behavior with respect to the requirements or other description of the expected behaviour. Understanding the difference will help you fix faults. Write your code so it is testable. 28 / 50

Pop Quiz How many times does this loop execute? errors f o r ( i =10; i <5; i ++) { d o s t u f f ( i ) ; } 29 / 50

Fault/Error/Failure Example i n t c o u n t s p a c e s ( char s t r ) { i n t l e n g t h, i, count ; count = 0 ; l e n g t h = s t r l e n ( s t r ) ; f o r ( i =1; i <l e n g t h ; i ++) { i f ( s t r [ i ] == ) { count++; } } return ( count ) ; } Software Fault: i=1 should be i=0. Software Error: some point in the program where you incorrectly count the number of spaces. Failure inputs and outputs that make the fault happen. For example count spaces("h H H"); would not cause the failure while count spaces(" H"); does. 30 / 50

Fault/Error/Failure Fault/Error/Failure is an important tool for thinking about how to test something (not just software). I am trying to correct faults that cause errors that cause failures. How do I design test cases that give failures that are caused by errors that are due to faults in the code. 31 / 50

Unit Testing xunit testing is a framework where individual functions and methods are tested. It is not particularly well suited to integration testing or regression testing. The best way to write testable code is to write the tests as you develop the code. Writing the test cases after the fact takes more time and effort than writing the test during the code. It is like good documentation you ll always find something else to do if you leave until after you ve written the code. This will be covered in more detail in the next lecture. 32 / 50

The heart of Unit Testing The unit test framework is quite powerful. But the heart are two functions: asserttrue assertfalse 33 / 50

asserttrue Suppose we want to test our string length function int istrlen(char*) The the following things should be true: The length of "Hello" is 5. The length of "" is 0. The length of "My kingdom for a horse." is 23. 34 / 50

asserttrue Then we would assert that the following things are true: asserttrue (The length of "Hello" is 5.) asserttrue(the length of "" is 0.) asserttrue (The length of "My kingdom for a horse." is 23.) 35 / 50

asserttrue Key idea in xunit: asserttrue( executable code ) Runs the executable code which should evaluate to true. assertfalse( executable code) Runs the executable code which should evaluate to false. 36 / 50

Different xunit frameworks run the tests in different ways. Python unit testing framework has a notion of test suites and registries. But it is quite simple to set up tests. Key to success in understanding complex APIs. Take example code and modify it to do what you want. 37 / 50

Python Unit Testing import c o d e t o b e t e s t e d import u n i t t e s t c l a s s TestCode ( u n i t t e s t. TestCase ) : def t e s t s ( s e l f ) : x = H e l l o s e l f. a s s e r t E q u a l ( len ( x ) == 5) 38 / 50

Important Unit Testing Concepts Setup. You might need to initialise some data structures. 39 / 50

Important Unit Testing Concepts Setup. You might need to initialise some data structures. The tests. Well you need to do tests. 40 / 50

Important Unit Testing Concepts Setup. You might need to initialise some data structures. The tests. Well you need to do tests. Teardown. Always clean up after you. 41 / 50

Important Unit Testing Concepts Setup. You might need to initialise some data structures. The tests. Well you need to do tests. Teardown. Always clean up after you. Important idea. Each test should be able to be run independently of the other tests. You don t know what order the tests will be run. Or even if all tests will be run. The programmer might just rerun the test that caused problems. 42 / 50

Teardown Teardown is more common in languages without automatic garbage collection. 43 / 50

More Testing Concepts Sometimes you don t have all the functionality implemented. Write dummy functions stubs that simply return null values rather doing any real work. Means that you can get your code going. Mock or Fake objects (people make a distinction but don t worry) implement enough of an object to get the test going. In fact in test driven development you write the test implement the mocks first and as you introduce more tests you add code to make the tests pass. 44 / 50

Test functions It is a matter of judgment and taste how many tests you put in each function. You don t want individual tests to take too much time to run. This will discourage the programmer from running individual test often. Whenever you compile your code you should run the tests. Often IDEs implement red and green bars for tests. Green means the test has passed and red means the test has failed. Green is good. 45 / 50

How to use Unit Tests When you are writing functions use test cases to see if the behaviour is as expected. Use tests as another form of documentation. Helps other programmers understand your API. When you find a bug write a test case and then correct the bug. Leave the test case there just in case fixing another bug reintroduces a bug. 46 / 50

Some things to test for Extreme values. Empty strings, large values. Loops executing zero, once, many times, and test the loop termination condition. f o r ( i n t i =0; i <M; i ++) { do something ( i ) ; } Find a test case that sets M to be 0, 1 and some larger number. Often M will not be an input parameter. You might have to work out how the input parameters affect M v o i d whatever ( char s t r ) { M = s t r l e n ( s t r ) ;.... } So you have to have a string of length 0,1 and some bigger number. 47 / 50

Some things to test for Code coverage. This is a complex area, but you should not really have untested code. i f (X==Y) { do something ( ) ; } e l s e { d o s o m e t h i n g e l s e ( ) ; } Find a test case where X equals Y and a test case where they are different. 48 / 50

Have a reason You can t test code just by letting a monkey type random things on the keyboard (although it sometimes helps). Try to have a reason for every test. Document reasons. When you test suite gets too large you have to work out which tests to delete. 49 / 50

Suggested Reading One of the testing gods is James Bach see his website 3 The book Introduction to Software Testing 4 by Ammann and Offutt. This is a bit theorectical. The book Test-Driven Development by Example by Kent Beck. Who is one of the fathers of unit testing, agile programming and extreme programming. A classic The ART of software testing Glenford Meyers. Online at the university library. 3 http://www.satisfice.com/ 4 http://cs.gmu.edu/~offutt/softwaretest/ 50 / 50