Working Software (Testing)

Slides:



Advertisements
Similar presentations
Testing Relational Database
Advertisements

Test process essentials Riitta Viitamäki,
SOFTWARE TESTING. INTRODUCTION  Software Testing is the process of executing a program or system with the intent of finding errors.  It involves any.
Annoucements  Next labs 9 and 10 are paired for everyone. So don’t miss the lab.  There is a review session for the quiz on Monday, November 4, at 8:00.
Software Architecture Prof.Dr.ir. F. Gielen
Software Testing.
1 Basic Definitions: Testing What is software testing? Running a program In order to find faults a.k.a. defects a.k.a. errors a.k.a. flaws a.k.a. faults.
Working Software (Testing) Today’s Topic – Why testing? – Some basic definitions – Kinds of testing – Test-driven development – Code reviews (not testing)
Software testing.
©Ian Sommerville 2004Software Engineering, 7th edition. Chapter 23 Slide 1 Software testing.
©Ian Sommerville 2004Software Engineering, 7th edition. Chapter 23 Slide 1 Software testing.
Software Testing. “Software and Cathedrals are much the same: First we build them, then we pray!!!” -Sam Redwine, Jr.
Jul The New Geant4 License J. Perl The New Geant4 License Makes clear the user’s wide- ranging freedom to use, extend or redistribute Geant4, even.
Terms: Test (Case) vs. Test Suite
©Ian Sommerville 2004Software Engineering, 7th edition. Chapter 23 Slide 1 Software testing.
Software Testing Verification and validation planning Software inspections Software Inspection vs. Testing Automated static analysis Cleanroom software.
System/Software Testing
©Ian Sommerville 2006Software Engineering, 8th edition. Chapter 23 Slide 1 Software testing Slightly adapted by Anders Børjesson.
University of Palestine software engineering department Testing of Software Systems Fundamentals of testing instructor: Tasneem Darwish.
CPIS 357 Software Quality & Testing
1 Software testing. 2 Testing Objectives Testing is a process of executing a program with the intent of finding an error. A good test case is in that.
Blue Diamond Scott Auge Amduus Information Works, Inc.
Testing Workflow In the Unified Process and Agile/Scrum processes.
Andrew McNab - License issues - 10 Apr 2002 License issues for EU DataGrid (on behalf of Anders Wannanen) Andrew McNab, University of Manchester
Dr. Tom WayCSC Testing and Test-Driven Development CSC 4700 Software Engineering Based on Sommerville slides.
Unit Testing 101 Black Box v. White Box. Definition of V&V Verification - is the product correct Validation - is it the correct product.
Software Testing Yonsei University 2 nd Semester, 2014 Woo-Cheol Kim.
©Ian Sommerville 2004Software Engineering, 7th edition. Chapter 22 Slide 1 Software Verification, Validation and Testing.
National Alliance for Medical Image Computing Licensing in NAMIC 3 requirements from NCBC RFA (paraphrased)
CPSC 873 John D. McGregor Session 9 Testing Vocabulary.
Testing. Today’s Topics Why Testing? Basic Definitions Kinds of Testing Test-driven Development Code Reviews (not testing) 1.
Chapter 1: Fundamental of Testing Systems Testing & Evaluation (MNN1063)
© 2006 Pearson Addison-Wesley. All rights reserved 2-1 Chapter 2 Principles of Programming & Software Engineering.
Software Engineering1  Verification: The software should conform to its specification  Validation: The software should do what the user really requires.
1 Working Software (Testing) Today’s Topic Why testing? Some basic definitions Kinds of testing Test-driven development Code reviews (not testing) Today.
CPSC 871 John D. McGregor Module 8 Session 1 Testing.
Chapter 1 Software Engineering Principles. Problem analysis Requirements elicitation Software specification High- and low-level design Implementation.
Software Quality Assurance and Testing Fazal Rehman Shamil.
HNDIT23082 Lecture 09:Software Testing. Validations and Verification Validation and verification ( V & V ) is the name given to the checking and analysis.
Testing and Debugging. Testing Fundamentals  Test as you develop Easier to find bugs early rather than later Prototyping helps identify problems early.
©Ian Sommerville 2004Software Engineering, 7th edition. Chapter 23 Slide 1 Software testing.
Testing Overview Software Reliability Techniques Testing Concepts CEN 4010 Class 24 – 11/17.
SOFTWARE TESTING LECTURE 9. OBSERVATIONS ABOUT TESTING “ Testing is the process of executing a program with the intention of finding errors. ” – Myers.
Verification vs. Validation Verification: "Are we building the product right?" The software should conform to its specification.The software should conform.
1 Software Testing. 2 What is Software Testing ? Testing is a verification and validation activity that is performed by executing program code.
CPSC 372 John D. McGregor Module 8 Session 1 Testing.
Software Testing.
Software Testing.
Regression Testing with its types
Verification and Validation
Software Engineering (CSI 321)
Testing Tutorial 7.
Software Testing.
John D. McGregor Session 9 Testing Vocabulary
Software Testing Introduction CS 4501 / 6501 Software Testing
Software Testing.
Agile
John D. McGregor Session 9 Testing Vocabulary
Software Quality Engineering
John D. McGregor Session 9 Testing Vocabulary
Lecture 09:Software Testing
Testing and Test-Driven Development CSC 4700 Software Engineering
Software testing.
CS240: Advanced Programming Concepts
CSE 303 Concepts and Tools for Software Development
Test Case Test case Describes an input Description and an expected output Description. Test case ID Section 1: Before execution Section 2: After execution.
CSE403 Software Engineering Autumn 2000 More Testing
Software Testing “If you can’t test it, you can’t design it”
Software Testing.
Introduction to Software Testing
Presentation transcript:

Working Software (Testing) Today’s Topic Why testing? Some basic definitions Kinds of testing Test-driven development Code reviews (not testing)

Why Testing? Ideally: we’d prove code correct, using formal mathematical techniques (with a computer, not chalk) Extremely difficult: for some trivial programs (100 lines) and many small (5K lines) programs Simply not practical to prove correctness in most cases – often not even for safety or mission critical code

Why Testing? Nearly ideally: use symbolic or abstract model checking to prove that a model is correct Automatically extract a mathematical abstraction from code Prove properties with model over all possible executions In practice, can work well for very simple properties (“this program never crashes in this particular way”), of some programs, but can’t handle complex properties (“this is a working file system”) Doesn’t work well for programs with complex data structures (like a file system)

As a last resort… … we can actually run the program, to see if it works This is software testing Always necessary, even when you can prove correctness – because the proof is seldom directly tied to the actual code that runs “Beware of bugs in the above code; I have only proved it correct, not tried it” – Knuth

NOT a last resort… Testing is a critical part of every software development effort Can too easily be left as an afterthought, after it is expensive to correct faults and when deadlines are pressing The more code that has been written when a fault is detected, the more code that may need to be changed to fix the fault Consider a key design flaw: better to detect with a small prototype, or after implementation is “finished”? May “have to ship” the code even though it has fatal flaws

Testing and Reviews in Processes Waterfall Requirements analysis Prototyping Design Implementation Testing Operation

Testing and Reviews in Processes Spiral Draft a menu of program designs Analyze risk & prototype Draft a menu of architecture designs Analyze risk & prototype Draft a menu of requirements Analyze risk & prototype Establish requirements Plan Establish architecture Plan Establish program design Operation Testing Implementation

Testing and Reviews in Processes Agile Do “spike” to evaluate & control risk Customer provides “stories” (short requirement snippets) Prioritize stories and plan Write/run/modify unit tests Operation Implement System and acceptance tests

Testing saves lives and money NIST report, “The Economic Impacts of Inadequate Infrastructure for Software Testing” (2002) Inadequate software testing costs the US alone between $22 and $59 billion annually Better approaches could cut this amount in half Major failures: Ariane 5 explosion, Mars Polar Lander, Intel’s Pentium FDIV bug Insufficient testing of safety-critical software can cost lives: THERAC-25 radiation machine: 3 dead We want our programs to be reliable Testing is how, in most cases, we find out if they are Ariane 5: exception-handling bug : forced self destruct on maiden flight (64-bit to 16-bit conversion: about 370 million $ lost) Mars Polar Lander crash site? THERAC-25 design

Today’s Topic Why testing? Some basic definitions Kinds of testing Test-driven development Code reviews (not testing)

Basic Definitions: Testing What is software testing? Running a program Generally, to reveal faults (bugs) Could be in the code Or in the spec Or in the documentation Or in the test…

Faults vs Failures Fault (defect): a static flaw in a program What we usually think of as “a bug” Failure: an observable incorrect behavior of a program as a result of an error Not every fault ever leads to a failure

Bugs Hopper’s “bug” (moth stuck in a relay on an early machine) “an analyzing process must equally have been performed in order to furnish the Analytical Engine with the necessary operative data; and that herein may also lie a possible source of error. Granted that the actual mechanism is unerring in its processes, the cards may give it wrong orders. ” – Ada, Countess Lovelace (notes on Babbage’s Analytical Engine) “It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise—this thing gives out and [it is] then that 'Bugs'—as such little faults and difficulties are called—show themselves and months of intense watching, study and labor are requisite. . .” – Thomas Edison Term “bug” erroneously attributed to Grace Hopper, who did have a literal bug

Terms: Test (Case) vs. Test Suite Test (case): one execution of the program, that may expose a bug Test suite: a set of executions of a program, grouped together A test suite is made of test cases Tester: a program that generates tests

Exhaustive vs. Representative Testing Can we test everything? File system is a library, called by other components of some flight software Operation Result mkdir (“/eng”, …) SUCCESS mkdir (“/data”, …) SUCCESS creat (“/data/image01”, …) SUCCESS creat (“/eng/fsw/code”, …) ENOENT mkdir (“/data/telemetry”, …) SUCCESS unlink (“/data/image01”) SUCCESS File system / /eng /data image01 /telemetry

Example: File System Testing How hard would it be to just try “all” the possibilities? Consider only core 7 operations (mkdir, rmdir, creat, open, close, read, write) Most of these take either a file name or a numeric argument, or both Even for a “reasonable” (but not provably safe) limitation of the parameters, there are 26610 executions of length 10 to try Not a realistic possibility (unless we have 1012 years to test) Assuming that you could run 56,235 tests per second!

“The Testing Problem” Cannot execute all possible tests (exhaustive testing): must choose a smaller set How do we select a small set of executions out of a very large set of executions? Fundamental problem of software testing research and practice An open (and essentially unsolvable, in the general case) problem

Terms: Coverage Coverage measures or metrics Abstraction of “what a test suite tests” in a structural sense Common measures: Statement coverage A.k.a line coverage or basic block coverage Which statements execute in a test suite Decision coverage Which boolean expressions in control structures evaluated to both true and false during suite execution Path coverage Which paths through a program’s control flow graph are taken in the test suite Mutation coverage Ability to detect random variations to the code

Practice Problem What inputs would you need to achieve int foo(int x, int y) { int z = 0; if ((x>0) && (y>0)) { z = x; } return z; What inputs would you need to achieve Statement coverage? Decision coverage? Path coverage? Mutation coverage with a mutation operator that replaces > with <? (Hint: Kill all mutants!) return z; z = x; int z = 0; if ((x>0) && (y>0)) { true false Control Flow Graph Answers Statement: foo(1,1) Decision: foo(1,1), foo(0,1) Path: foo(1,1), foo(0,1) Mutation: x < 0: foo(-1,1) y < 0: foo(1,-1) x < 0 && y < 0: foo(-1,-1) OR just foo(1,1) would work

Terms: Coverage Measures In general, used to measure the quality of a test suite Even in cases where the suite was designed for some other purpose (such as testing lots of different use scenarios) Not always a very good measure of suite quality, but “better than nothing” We “open the box” in white box testing partly to look at (and design tests to achieve) coverage

Today’s Topic Why testing? Some basic definitions Kinds of testing Test-driven development Code reviews (not testing)

Kinds of testing Whitebox Blackbox Unit Integration System Acceptance Regression

Terms: Black Box Testing Treats a program or system as a That is, testing that does not look at source code or internal structure of the system Send a program a stream of inputs, observe the outputs, decide if the system passed or failed the test Abstracts away the internals – a useful perspective for integration and system testing Sometimes you don’t have access to source code, and can make little use of object code True black box? Access only over a network

Terms: White Box Testing Opens up the box! (also known as glass box, clear box, or structural testing) Use source code (or other structure beyond the input/output spec.) to design test cases

Stages of Testing Unit testing is the first phase, done by developers of modules Integration testing combines unit-tested modules and tests how they interact System testing tests a whole program to make sure it meets requirements Acceptance testing by users to see if system meets actual use requirements

Stages of Testing: Unit Testing Unit testing is the first phase, mostly done by developers of modules Typically the earliest type of testing done Unit could be as small as a single function or method Often relies on stubs to represent other modules and incomplete code Tools to support unit tests available for most popular languages, e.g. JUnit (http://junit.org) Stub: A piece of code that simulates the activity of missing components. Driver: A piece of code that passes test cases to another piece of code.

Stages of Testing: Integration Testing Integration testing combines unit-tested modules and tests how they interact Relies on having completed units After unit testing, before system testing Test cases focus on interfaces between components, and assemblies of multiple components Often more formal (test plan presentations) than unit testing

Stages of Testing: System Testing System testing tests a whole program to make sure it meets requirements After integration testing Focuses on “breaking the system” Defects in the completed product, not just in how components interact Checks quality of requirements as well as the system Often includes stress testing, goes beyond bounds of well-defined behavior

An aspect of System Testing: Functional Testing Functional testing is when a developer tests a program from a “user’s” perspective – does it do what it should? It’s a different mindset than unit testing, which often proceeds from the perspective of other parts of the program Module spec/interface, not user interaction Sort of a fuzzy line – consider a file system – how different is the use by a program and use of UNIX commands at a prompt by a user? Building inspector does “unit testing”; you (or user), walking through the house to see if its livable, perform “functional testing” Kick the tires vs. take it for a spin?

Stages of Testing: Acceptance Testing Acceptance testing by users to see if system meets actual use requirements Black box testing By end-users to determine if the system produced really meets their needs May revise requirements/goals as much as find bugs in the code/system

Appropriate at all times: Regression Testing Changes can break code, reintroduce old bugs Things that used to work may stop working (e.g., because of another “fix”) – software regresses Usually a set of cases that have failed (& then succeeded) in the past Finding small regressions is an ongoing research area – analyze dependencies “. . . as a consequence of the introduction of new bugs, program maintenance requires far more system testing. . . . Theoretically, after each fix one must run the entire batch of test cases previously run against the system, to ensure that it has not been damaged in an obscure way. In practice, such regression testing must indeed approximate this theoretical idea, and it is very costly." - Brooks, The Mythical Man-Month

Today’s Topic Why testing? Some basic definitions Kinds of testing Test-driven development Code reviews (not testing)

Test-Driven Development One way to make sure code is tested as early as possible is to write test cases before the code Idea arising from Extreme Programming and often used in agile development Write (automated) test cases first Then write the code to satisfy tests

Test-Driven Development How to add a feature to a program, in test-driven development Add a test case that fails, but would succeed with the new feature implemented Run all tests, make sure only the new test fails Write code to implement the new feature Rerun all tests, making sure the new test succeeds (and no others break)

Test-Driven Development Cycle

Test-Driven Development Benefits Results in lots of useful test cases A very large regression set Forces attention to actual behavior of software: observable & controllable behavior Only write code as needed to pass tests And may get good coverage of paths through the program, since they are written in order to pass the tests Reduces temptation to tailor tests to idiosyncratic behaviors of implementation Testing is a first-class activity in this kind of development

Test-Driven Development Problems Need institutional support Difficult to integrate with a waterfall development Management may wonder why so much time is spent writing tests, not code Lots of test cases may create false confidence If developers have written all tests, may be blind spots due to false assumptions made in coding and in testing, which are tightly coupled

Today’s Topic Why testing? Some basic definitions Kinds of testing Test-driven development Code reviews (not testing)

Not Testing: Code Reviews Not testing, exactly, but an important method for finding bugs and determining the quality of code Code walkthrough: developer leads a review team through code Informal, focus on code Code inspection: review team checks against a list of concerns Team members prepare offline in many cases Team moderator usually leads

Not Testing: Code Reviews Code inspections have been found to be one of the most effective practices for finding faults Some experiments show removal of 67-85% of defects via inspections Some consider XP’s pair programming as a kind of “code review” process, but it’s not quite the same Why? Can review/walkthrough requirements and design documents, not just code!

Testing and Reviews in Processes Key differences? More integrated in agile Part of the “inner loop” More formal, external, “barrier” in waterfall In practice, how much testing is done by developers will vary beyond just process Agile methods tend to encourage heavy unit testing

What’s next for you Create your… User stories Tasks and estimates UML sequence diagrams or spikes A plan describing What will be done in a week What will be done in two weeks Summary of who did what (customer & you)

Copyright (c) Christopher Scaffidi 2009 All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Oregon State University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Modified by Scott D. Fleming <Scott.Fleming@memphis.edu> 2011.