Command-form Coverage for Testing DB Applications
Alessandro Orso William G.J. Halfond Georgia Institute of Technology
Supported by NSF awards CCR- 0205422 and CCR-0306372 to GA Tech and by DHS and US Air Force under Contract No. FA8750-05-C-0179.
Command-form Coverage for Testing DB Applications Alessandro Orso - - PowerPoint PPT Presentation
Command-form Coverage for Testing DB Applications Alessandro Orso William G.J. Halfond Georgia Institute of Technology Supported by NSF awards CCR- 0205422 and CCR-0306372 to GA Tech and by DHS and US Air Force under Contract No.
Supported by NSF awards CCR- 0205422 and CCR-0306372 to GA Tech and by DHS and US Air Force under Contract No. FA8750-05-C-0179.
Alex Orso – ASE 2006 – September 2006
User Interface Application Database
Alex Orso – ASE 2006 – September 2006
1) SELECT title, author, description, avg(rating) FROM books WHERE isbn = <*> GROUP BY isbn 2) SELECT title, author, description, avg(rating) FROM books WHERE author = ‘<*>’ . . . 18) SELECT title, author, description, avg(rating) FROM books WHERE author = ‘<*>’ GROUP BY rating
UI Application DB ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
name “tiitle,”
concatenation
clause for grouping function
unless one specific line is executed ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
name “tiitle,”
concatenation
clause for grouping function
unless one specific line is executed ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
name “tiitle,”
concatenation
clause for grouping function
unless one specific line is executed ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
name “tiitle,”
concatenation
clause for grouping function
unless one specific line is executed ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
Test Cases Faults Revealed Queries Generated ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
Test Cases
Faults Revealed
Queries Generated
descriptionFROM books WHERE isbn = 0123 GROUP BY isbn ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
Test Cases
Faults Revealed
Queries Generated
descriptionFROM books WHERE isbn = 0123 GROUP BY isbn
descriptionFROM books WHERE author = ‘Poe’ ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
Test Cases
Faults Revealed
Queries Generated
descriptionFROM books WHERE isbn = 0123 GROUP BY isbn
descriptionFROM books WHERE author = ‘Poe’
description, avg(rating) FROM books WHERE author = ‘Poe’ GROUP BY rating ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
Test Cases
Faults Revealed
Queries Generated
descriptionFROM books WHERE isbn = 0123 GROUP BY isbn
descriptionFROM books WHERE author = ‘Poe’
description, avg(rating) FROM books WHERE author = ‘Poe’ GROUP BY rating ResultSet srchBook(String searchString, int searchType, bool showRating, bool grpByRating, bool grpByISBN) { String[] srchFields = {"tiitle", "author", "isbn"}; String queryStr = "SELECT title, author, description"; if (showRating) queryStr += ", avg(rating) "; queryStr += "FROM books WHERE "; if (searchType==2) queryStr += srchFields[searchType] + " = " + searchString; else queryStr += searchFields[searchType] + " = ’“ + searchString + "’ "; if (grpByRating) queryStr += "GROUP BY rating "; else if (grpByISBN) queryStr += " GROUP BY isbn "; return db.executeQuery(queryStr); }
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
User Interface Application Database
Alex Orso – ASE 2006 – September 2006
Example: SELECT title, author, description FROM books WHERE author = ‘Poe’ SELECT title, author, description FROM books WHERE author = ‘Capote’ SELECT title, author, description FROM books WHERE author = ‘Dante’ => SELECT title, author, description FROM books WHERE author = ‘<*>’
User Interface Application Database
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
public ResultSet searchBooks(String searchString, int searchType, boolean showRating, boolean groupByRating, boolean groupByISBN) { 1. String[] searchFields = {"tiitle", "author", "isbn"}; 2. String queryStr= "SELECT title, author, description"; 3. if (showRating) 4. queryStr += ", avg(rating) "; …
[Christensen, Møller, and Schwartzbach 2003]
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
[+6] [+2] [+1]
[Ball and Larus 1996]
Alex Orso – ASE 2006 – September 2006
At runtime: Match dynamically-generated queries to command forms (i.e., to paths in the command-form models)
Query:
[+9]
Alex Orso – ASE 2006 – September 2006
Query:
[+3] [+6] [+2]
At runtime: Match dynamically-generated queries to command forms (i.e., to paths in the command-form models)
Alex Orso – ASE 2006 – September 2006
covers
Query: Command form: At runtime: Match dynamically-generated queries to command forms (i.e., to paths in the command-form models)
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
command-form coverage for the test suite
=> Initial evidence that command-form coverage cannot be trivially achieved
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
21 162 1 MembersGrid all 1 1 AdminMenu all 20 2 ShoppingCart 26 394 1 OrdersGrid 31 617 1 AdminBooks 150 1583 4 BookDetail all 6 1 MyInfo Estimated # comm. forms covered by branch-adequate test suite # command forms # DIP Servlet
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006
Alex Orso – ASE 2006 – September 2006