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

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

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

For Your Amusement. Beware of bugs in the above code; I have only proved it correct, not tried it. Donald Knuth. Program Verification

Princeton University. Testing. Computer Science 217: Introduction to Programming Systems

EXTERNAL TESTING. Princeton University Computer Science 217: Introduction to Programming Systems. Why Test? Testing. Why Test? Why Test?

Το Υλικό από το βιβλίο. The Practice of Programming. (Kernighan & Pike) Chapter 6

Το Υλικό από το βιβλίο. The Practice of Programming. (Kernighan & Pike) Chapter 6

Princeton University Computer Science 217: Introduction to Programming Systems. Testing

do { write_program; OK = test_program ( ); } while (!OK); upload program to customer;

Debugging (Part 1) The material for this lecture is drawn, in part, from The Practice of Programming (Kernighan & Pike) Chapter 5

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

Welcome! COMP s1. Programming Fundamentals

Welcome! COMP s1 Lecture 7. COMP s1. Before we begin. Strings. Programming Fundamentals. Overview. Andrew Bennett

Chapter 11, Testing. Using UML, Patterns, and Java. Object-Oriented Software Engineering

Program Verification. Aarti Gupta

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

(See related materials in textbook.) CSE 435: Software Engineering (slides adapted from Ghezzi et al & Stirewalt

Intermediate Programming, Spring 2017*

Unit Testing as Hypothesis Testing

An Introduction to Systematic Software Testing. Robert France CSU

Software Testing part II (white box) Lecturer: Giuseppe Santucci

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

Topics in Software Testing

Program Analysis. Program Analysis

Testing & Debugging TB-1

Lecture 15 Software Testing

Introduction to Dynamic Analysis

Terminology. There are many different types of errors and different ways how we can deal with them.

Goals of C "" The Goals of C (cont.) "" Goals of this Lecture"" The Design of C: A Rational Reconstruction"

Best Practices in Programming

The Design of C: A Rational Reconstruction: Part 2

Goals of this Lecture

Software Testing Lecture 1. Justin Pearson

Software Engineering

Facts About Testing. Cost/benefit. Reveal faults. Bottom-up. Testing takes more than 50% of the total cost of software development

Why testing and analysis. Software Testing. A framework for software testing. Outline. Software Qualities. Dependability Properties

MONIKA HEINER.

Testing Objectives. Successful testing: discovers previously unknown errors

Software Quality Assurance. David Janzen

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

Princeton University Computer Science 217: Introduction to Programming Systems. A Taste of C

Problem Solving with C++

C Language Part 2 Digital Computer Concept and Practice Copyright 2012 by Jaejin Lee

Continued from previous lecture

Unit Testing as Hypothesis Testing

Absolute C++ Walter Savitch

Testing. UW CSE 160 Winter 2016

Testing. CMSC 433 Programming Language Technologies and Paradigms Spring A Real Testing Example. Example (Black Box)?

Storage class and Scope:

Software Testing. Software Testing

About this exam review

Program Correctness and Efficiency. Chapter 2

CSE 331 Midterm Exam Sample Solution 2/13/12

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

Testing, Timing, Profiling, & Instrumentation. Testing, Profiling, & Instrumentation

10. Software Testing Fundamental Concepts

Iteration. CSE / ENGR 142 Programming I. Chapter 5. Motivating Loops. One More Type of Control Flow. What s Wrong with HW1?

The Design of C: A Rational Reconstruction (cont.)

Verification and Validation. Verification and validation

Performance Improvement. The material for this lecture is drawn, in part, from The Practice of Programming (Kernighan & Pike) Chapter 7

Agile Software Development. Lecture 7: Software Testing

CS61C Machine Structures. Lecture 4 C Pointers and Arrays. 1/25/2006 John Wawrzynek. www-inst.eecs.berkeley.edu/~cs61c/

CSCI 2132 Software Development. Lecture 17: Functions and Recursion

Getting those Bugs Out --Software Testing

o Echo the input directly to the output o Put all lower-case letters in upper case o Put the first letter of each word in upper case

Software Engineering 2 A practical course in software engineering. Ekkart Kindler

Decision Making and Loops

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

Princeton University Computer Science 217: Introduction to Programming Systems The Design of C

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

Software Engineering Testing and Debugging Testing

The Design of C: A Rational Reconstruction (cont.)" Jennifer Rexford!

1/25/2018. ECE 220: Computer Systems & Programming. Write Output Using printf. Use Backslash to Include Special ASCII Characters

Computer Programming: Skills & Concepts (CP) Files in C

Software Testing Prof. Meenakshi D Souza Department of Computer Science and Engineering International Institute of Information Technology, Bangalore

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

Lecture 02 C FUNDAMENTALS

CSCI S-Q Lecture #12 7/29/98 Data Structures and I/O

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

Software Testing. Testing: Our Experiences

Laboratorio di Tecnologie dell'informazione

Three General Principles of QA. COMP 4004 Fall Notes Adapted from Dr. A. Williams

Introduction to C. CS2023 Winter 2004

Princeton University Computer Science 217: Introduction to Programming Systems. Building Multi-File Programs with the make Tool

Computer Programming: Skills & Concepts (CP1) Files in C. 18th November, 2010

8. Characters, Strings and Files

Software Testing. Software Testing. in the textbook. Chapter 8. Verification and Validation. Verification and Validation: Goals

Topic 8: I/O. Reading: Chapter 7 in Kernighan & Ritchie more details in Appendix B (optional) even more details in GNU C Library manual (optional)

Princeton University Computer Science 217: Introduction to Programming Systems. Goals of this Lecture. A Taste of C. Agenda.

Testing and Debugging

Chapter 2. Section 2.5 while Loop. CS 50 Hathairat Rattanasook

Programming Embedded Systems

Testing & Continuous Integration. Kenneth M. Anderson University of Colorado, Boulder CSCI 5828 Lecture 20 03/19/2010

DECISION MAKING STATEMENTS

Manuel Oriol, CHCRC-C, Software Testing ABB

Reminder. Sign up for ee209 mailing list. Precept. If you haven t received any from ee209 yet Follow the link from our class homepage

Conditional Statement

CSE 331 Software Design & Implementation

Laboratorio di Tecnologie dell'informazione

Testing: Test design and testing process

Transcription:

Words from the Wise Testing On two occasions I have been asked [by members of Parliament], Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out? I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. Charles Babbage Program testing can be quite effective for showing the presence of bugs, but is hopelessly inadequate for showing their absence. Edsger Dijkstra Beware of bugs in the above code; I have only proved it correct, not tried it. Donald Knuth The material for this lecture is drawn, in part, from The Practice of Programming (Kernighan & Pike) Chapter 6 1 2 Goals of this Lecture Help you learn about: Internal testing External testing General testing strategies Why? It s hard to know if a large program works properly A power programmer expends at least as much effort writing test code as he/she expends writing the program itself A power programmer knows many testing strategies Program Verification Ideally: Prove that your program is correct Can you prove properties of the program? Can you prove that it even terminates? See Turing s Halting Problem Specification program.c Program Checker? Right or Wrong 3 4 1

Program Testing External vs. Internal Testing Pragmatically: Convince yourself that your program probably works Specification program.c Testing Strategy Probably Right or Certainly Wrong Types of testing External testing Designing data to test your program Internal testing Designing your program to test itself 5 6 External Testing External Testing Designing data to test your program 4 techniques Statement Testing (1) Statement testing Testing to satisfy the criterion that each statement in a program be executed at least once during program testing. Glossary of Computerized System and Software Development Terminology 7 8 2

Statement Testing Example Path Testing Example pseudocode: if (condition1) statement1; else statement2; if (condition2) statement3; else statement4; Statement testing: Should make sure both if statements and all 4 nested statements are executed How many data sets are required? (2) Path testing Testing to satisfy coverage criteria that each logical path through the program be tested. Often paths through the program are grouped into a finite set of classes. One path from each class is then tested. Glossary of Computerized System and Software Development Terminology 9 10 Path Testing Example Example pseudocode: if (condition1) statement1; else statement2; if (condition2) statement3; else statement4; Path testing: Should make sure all logical paths are executed How many data sets are required? Realistic program => combinatorial explosion More difficult than statement testing For simple programs, can enumerate all paths through the code Otherwise, sample paths through code with random input 11 Boundary Testing (3) Boundary testing A testing technique using input values at, just below, and just above, the defined limits of an input domain; and with input values causing outputs to be at, just below, and just above, the defined limits of an output domain. Glossary of Computerized System and Software Development Terminology Also known as corner case testing 12 3

Boundary Testing Example Specification: Read line from stdin, store as string in array (without \n ) First attempt: char s[arraysize]; for (i=0; ((i < ARRAYSIZE-1) && (s[i]=getchar()) = '\n'); i++) ; s[i] = '\0'; Example Boundary Conditions Consider boundary conditions: 1. stdin contains no characters (empty file) 2. stdin starts with '\n' (empty line) 3. stdin contains characters but no '\n 4. stdin line contains exactly ARRAYSIZE-1 characters 5. stdin line contains exactly ARRAYSIZE characters 6. stdin line contains more than ARRAYSIZE characters Does it work? 13 14 Testing the First Attempt Test Results for First Attempt Embed code in complete program: #include <stdio.h> enum {ARRAYSIZE = 5; /* Artificially small */ int main(void) { char s[arraysize]; for (i=0; ((i < ARRAYSIZE-1) && (s[i]=getchar()) = '\n'); i++) ; s[i] = '\0'; for (i = 0; i < ARRAYSIZE; i++) { if (s[i] == '\0') break; putchar(s[i]); return 0; 15 char s[arraysize]; for (i=0; ((i < ARRAYSIZE-1) && (s[i]=getchar()) = '\n')); i++) ; s[i] = '\0'; 1. stdin contains no characters (empty file) ÿÿÿÿÿ Fail 2. stdin starts with '\n' (empty line) n Again: Pass Does it work? 3. stdin contains characters but no '\n ab abÿÿÿ Fail 4. stdin line contains exactly ARRAYSIZE-1 characters abc n abc Pass 5. stdin line contains exactly ARRAYSIZE characters abcd n abcd Pass 6. stdin line contains more than ARRAYSIZE characters abcde n abcd Pass or Fail??? 16 4

Ambiguity in Specification If stdin line is too long, what should happen? Keep first ARRAYSIZE characters, discard the rest? Keep first ARRAYSIZE -1 characters + '\0' char, discard the rest? Keep first ARRAYSIZE -1 characters + '\0' char, save the rest for the next call to the input function? Define what to do Keep first ARRAYSIZE -1 characters + '\0' char, save the rest for the next call to the input function A Second Attempt Second attempt: char s[arraysize]; for (i = 0; i < ARRAYSIZE-1; i++) { s[i] = getchar(); if ((s[i] == EOF) (s[i] == '\n')) break; s[i] = '\0'; Does it work? 17 18 Testing the Second Attempt Embed code in complete program: #include <stdio.h> enum {ARRAYSIZE = 5; /* Artificially small */ int main(void) { char s[arraysize]; for (i = 0; i < ARRAYSIZE-1; i++) { s[i] = getchar(); if ((s[i] == EOF) (s[i] == '\n')) break; s[i] = '\0'; for (i = 0; i < ARRAYSIZE; i++) { if (s[i] == '\0') break; putchar(s[i]); return 0; 19 Test Results for Second Attempt char s[arraysize]; for (i = 0; i < ARRAYSIZE-1; i++) { s[i] = getchar(); if ((s[i] == EOF) (s[i] == '\n')) break; s[i] = '\0'; 1. stdin contains no characters (empty file) Pass 2. stdin starts with '\n' (empty line) Does it work? n Pass 3. stdin contains characters but no '\n ab ab Pass 4. stdin line contains exactly ARRAYSIZE-1 characters abc n abc Pass 5. stdin line contains exactly ARRAYSIZE characters abcd n abcd Pass 6. stdin line contains more than ARRAYSIZE characters abcde n abcd Pass 20 5

Morals of this Little Story Stress Testing Testing can reveal the presence of bugs, but not their absence Complicated boundary cases often are symptomatic of bad design or bad specification Clean up the specification if you can Otherwise, fix the code (4) Stress testing Testing conducted to evaluate a system or component at or beyond the limits of its specified requirements Glossary of Computerized System and Software Development Terminology What to generate Very large input sets Random input sets (binary vs. ASCII) Use computer to generate input sets 21 22 Stress Testing Example 1 Specification: Copy all characters of stdin to stdout Attempt: Stress Testing Example 2 Specification: Print number of characters in stdin Attempt: #include <stdio.h> int main(void) { char c; while ((c = getchar()) = EOF) putchar(c); return 0; Does it work? Hint: Consider random input sets Does this example shed light on the previous one? 23 #include <stdio.h> int main(void) { char charcount = 0; while (getchar() = EOF) charcount++; printf("%d\n", charcount); return 0; Does it work? Hint: Consider large input sets 24 6

External Testing Summary External testing: Designing data to test your program External testing taxonomy (1) Statement testing (2) Path testing (3) Boundary testing (4) Stress testing Aside: The assert Macro The assert macro One actual parameter Should evaluate to 0 (FALSE) or non-0 (TRUE) If TRUE: Do nothing If FALSE: Print message to stderr assert at line x failed Exit the process 25 26 Uses of assert Typical uses of assert Validate formal parameters int gcd(int i, int j) { assert(i > 0); assert(j > 0); Check for impossible logical flow switch (state) { case START: break; case COMMENT: break; default: assert(0); /* Never should get here */ Internal Testing Internal testing Designing your program to test itself 3 techniques Check invariants (described in a few slides) 27 28 7

Checking Invariants Checking Invariants (cont.) (1) Checking invariants Check aspects of data structures that shouldn t vary Convenient to use assert to check invariants Remember this for Assignment 6 Example: doubly-linked list insertion function Traverse doubly-linked list; when node x points forward What other to node y, does node y point invariants could backward to node x? be checked? Example: balanced binary search tree insertion function Traverse tree; are nodes still sorted? What other invariants could be checked? 29 int isvalid(mytype object) { Check invariants. Return 1 (TRUE) if object passes all tests, and 0 (FALSE) otherwise. void myfunction(mytype object) { assert(isvalid(object)); Manipulate object. assert(isvalid(object)); 30 Checking Return Values (2) Checking function return values In Java and C++: Method that detects error can throw a checked exception Calling method must handle the exception (or rethrow it) In C: No exception-handling mechanism Function that detects error typically indicates so via return value Programmer easily can forget to check return value Programmer (generally) should check return value Checking Return Values (cont.) (2) Checking function return values (cont.) Example: scanf() returns number of values read Bad code scanf("%d", &i); if (scanf("%d", &i) = 1) /* Error */ Example: printf() returns number of characters (not values) written. Can fail if writing to file and disk is full. Bad code? int i = 100; printf("%d", i); Good code Good code? int i = 100; if (printf("%d", i) = 3) /* Error */ Is this overkill? 31 32 8

Changing Code Temporarily (3) Changing code temporarily To generate artificial boundary or stress tests Example: Array-based sorting program Temporarily make array very small Remember this for Assignment 3 Example: Program that uses a hash table Temporarily make hash function return a constant All bindings map to one bucket, which becomes very large Does the program handle large buckets? Leave Testing Code Intact Do not remove testing code when your code is finished In industry, code is rarely finished Leave tests in the code Maybe embed in calls of assert Calls of assert can be disabled; described in precept 33 34 Internal Testing Summary General Testing Strategies Internal testing: Designing your program to test itself Internal testing techniques (1) Checking invariants (2) Checking function return values (3) Changing code temporarily Leaving testing code intact Beware: Internal testing can reduce code clarity General testing strategies 5 strategies 35 36 9

Automation (1) Automation Create scripts and data files to test your programs Create software clients to test your modules Know what to expect Generate output that is easy to recognize as right or wrong Automated testing can provide: Much better coverage than manual testing Bonus: Examples of typical use of your code Have you used these techniques in COS 217 programming assignments? Testing Incrementally (2) Testing incrementally Test as you write code Add test cases as you create new code Test individual modules, and then their interaction Do regression testing After a bug fix, make sure program has not regressed That is, make sure previously working code is not broken Rerun all test cases Note the value of automation 37 38 Testing Incrementally (cont.) (2) Testing incrementally (cont.) Create scaffolds and stubs to test the code that you care about Comparing Implementations (3) Comparing implementations Function 1 Scaffold: Temporary code that calls code that you care about Make sure independent implementations behave the same way Assignment 1: compare behavior of decomment program with gcc217 E Function that you care about Function 2 Function 3 Stub: Temporary code that is called by code that you care about 39 Assignment 2: compare behavior of your Str functions with that of standard string library functions 40 10

Bug-Driven Testing (4) Bug-driven testing Find a bug => create a test case that catches it Facilitates regression testing Fault Injection (5) Fault injection Intentionally (temporarily) inject bugs Determine if testing finds them i.e. Test the testing 41 42 General Strategies Summary General testing strategies (1) Automation (2) Testing incrementally (3) Comparing implementations (4) Bug-driven testing (5) Fault injection Who Tests What Programmers White-box testing Pro: Programmer knows all data paths Con: Influenced by how code is designed/written Quality Assurance (QA) engineers Black-box testing Pro: No knowledge about the implementation Con: Unlikely to test all logical paths Customers Field testing Pros: Unexpected ways of using the software; debug specs Cons: Not enough cases; customers don t like participating in this process; malicious users can exploit the bugs 43 44 11

Summary Summary (cont.) External testing taxonomy Statement testing Path testing Boundary testing Stress testing Internal testing techniques Checking invariants Checking function return values Changing code temporarily General testing strategies Automation Testing incrementally Regression testing Scaffolds and stubs Comparing independent implementations Bug-driven testing Fault injection Test the code, the specification and the tests 45 46 12