Improving Test Case Generation for Web Applications Using Automated - - PowerPoint PPT Presentation

improving test case generation for web applications using
SMART_READER_LITE
LIVE PREVIEW

Improving Test Case Generation for Web Applications Using Automated - - PowerPoint PPT Presentation

Improving Test Case Generation for Web Applications Using Automated Interface Discovery William G.J. Halfond and Alessandro Orso Georgia Institute of Technology Web Application Overview Request Web http://host?login=alice&pin=1234


slide-1
SLIDE 1

Improving Test Case Generation for Web Applications Using Automated Interface Discovery

William G.J. Halfond and Alessandro Orso Georgia Institute of Technology

slide-2
SLIDE 2

Web Application Overview

DB Other Systems Web Server End Users Request http://host?login=alice&pin=1234 HTML Pages

Web Application HTML Servlets

slide-3
SLIDE 3

public void write(File outfile, String buffer, int length)

Testing Web Applications

Domain information Parameter grouping

slide-4
SLIDE 4

Testing Web Applications

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) // generate second registration page else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else // generate initial registration page int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-5
SLIDE 5

Testing Web Applications

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) // generate second registration page else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else // generate initial registration page int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-6
SLIDE 6

Testing Web Applications

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) // generate second registration page else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else // generate initial registration page int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-7
SLIDE 7

Testing Web Applications

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) // generate second registration page else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else // generate initial registration page int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-8
SLIDE 8

Testing Web Applications

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) // generate second registration page else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else // generate initial registration page int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-9
SLIDE 9

Testing Web Applications

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) // generate second registration page else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else // generate initial registration page int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-10
SLIDE 10

Developer-specified models

Ricca and Tonella, ICSE 2001

Approaches to Web Application Testing

Captured user-sessions

Kallepalli and Tian, TSE 2001 Sprenkle et. al., ASE 2006 Elbaum et. al., ICSE 2003

Black-box analysis

Huang et. al., WWW 2003 Elbaum et. al., WODA 2006

Static code analysis

Deng et al., SEN 2004

slide-11
SLIDE 11

Goal of Our Approach

Develop a technique to automatically discover all of the interfaces to a web application

Interfaces Web Application HTML Servlets

  • Input parameters
  • Domain information
slide-12
SLIDE 12

Presentation Outline

  • Definitions
  • Interface Discovery Algorithm
  • Empirical Evaluation
  • Conclusions and Future Work
slide-13
SLIDE 13

Definitions:

  • 1. Input Parameter

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param http://host?login=alice&pin=1234

slide-14
SLIDE 14

Definitions:

  • 1. Input Parameter
  • 2. Parameter Function

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-15
SLIDE 15

Definitions:

  • 1. Input Parameter
  • 2. Parameter Function
  • 3. Domain Operations

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-16
SLIDE 16

Definitions:

  • 1. Input Parameter
  • 2. Parameter Function
  • 3. Domain Operations
  • 4. Web Interface

void main(Request req) String formAction = req.getParam(“formAction”) if (formAction.equals(“chooseLogin”)) String requestedLogin = req.getParam(“login”) int pin = getNumParam(req, “pin”) registerLogin(requestedLogin, pin) else if (formAction.equals(“personalInfo”)) String name = req.getParam(“name”) int zip = getNumParam(req, “zip”) if (zip == 30318) finishRegistration(id, name) else error(“You do not live in 30318”) else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

slide-17
SLIDE 17

Interface Discovery Algorithm

Phase 1: Compute domain information for each Input Parameter Phase 2: Identify names of Input Parameters and group them into distinct interfaces

Phase 1 Phase 2 Interfaces Web Application HTML Servlets

slide-18
SLIDE 18

Phase 1: Compute Domain Information

For each call to a Parameter Function:

  • 1. Infer domain information by
  • Following def-use chains involving the return value
  • Considering operations performed on the uses
  • 2. Annotate call site accordingly

Web Application with domain information annotations Web Application HTML Servlets Phase 1

slide-19
SLIDE 19

Phase 1

Extract domain information.

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParameter("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318" ) else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

Numeric Numeric Numeric “30318” String “chooseLogin” “personalInfo” String String

slide-20
SLIDE 20

Phase 2: Compute Interfaces

For each method m:

  • 1. Discover Input Parameter names
  • 2. Identify sets of Input Parameters accessed along a path
  • 3. For each set, add to m’s summary an interface consisting of
  • Input Parameters in the set
  • Corresponding domain information

Web Application with domain information annotations Phase 2 Interfaces

slide-21
SLIDE 21

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

String “chooseLogin” “personalInfo” String Numeric Numeric Numeric “30318” String

slide-22
SLIDE 22

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

paramName:Numeric String “chooseLogin” “personalInfo” String Numeric Numeric “30318” String

slide-23
SLIDE 23

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else … int getNumParam(Request req, String paramName) String paramValue = req.getParam(paramName) int param = Integer.parseInt(paramValue) return param

String “chooseLogin” “personalInfo” String Numeric Numeric “30318” String fp(2):Numeric

slide-24
SLIDE 24

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else …

String “chooseLogin” “personalInfo” String Numeric Numeric “30318” String getNumParam(Request req, String paramName) fp(2):Numeric

slide-25
SLIDE 25

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else …

login:String formAction:String “chooseLogin” “personalInfo” pin:Numeric zip:Numeric “30318” name:String getNumParam(Request req, String paramName) fp(2):Numeric

slide-26
SLIDE 26

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else …

login:String formAction:String “chooseLogin” “personalInfo” pin:Numeric zip:Numeric “30318” name:String getNumParam(Request req, String paramName) fp(2):Numeric Servlet Interfaces: (formAction, login, pin)

slide-27
SLIDE 27

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else …

login:String formAction:String “chooseLogin” “personalInfo” pin:Numeric zip:Numeric “30318” name:String getNumParam(Request req, String paramName) fp(2):Numeric Servlet Interfaces: (formAction, login, pin) (formAction, name, zip)

slide-28
SLIDE 28

void main(Request req) String formAction = req.getParam("formAction”) if (formAction.equals("chooseLogin” )) String requestedLogin = req.getParam("login") int pin = getNumParam(req, "pin") registerLogin(requestedLogin, pin) else if (formAction.equals("personalInfo")) String name = req.getParam("name") int zip = getNumParam(req, "zip") if (zip == 30318) finishRegistration(id, name) else error("You do not live in 30318") else …

login:String formAction:String “chooseLogin” “personalInfo” pin:Numeric zip:Numeric “30318” name:String getNumParam(Request req, String paramName) fp(2):Numeric Servlet Interfaces: (formAction, login, pin) (formAction, name, zip) (formAction)

slide-29
SLIDE 29

Servlet Interfaces

“personalInfo” “chooseLogin” String formAction

3

“30318” Numeric pin

  • String

login “personalInfo” “chooseLogin” String formAction

2

  • Numeric

pin

  • String

login “personalInfo” “chooseLogin” String formAction

1

Relevant Values Domain-Type Name Interface

slide-30
SLIDE 30

Empirical Evaluation

  • Research Question 1: Does our technique

discover a higher number of interfaces than a conventional approach?

  • Research Question 2: Does testing

effectiveness improve when using interface information generated by our technique instead of a conventional approach?

slide-31
SLIDE 31

Prototype Implementation - WAM

  • Analyzes bytecode of Web application

servlets

  • Targets Java Enterprise Edition (JEE)
  • Uses several analysis libraries and tools
  • Call and control-flow graphs: SOOT
  • Data-dependency: INDUS
  • Resolving string values: JSA
slide-32
SLIDE 32

Spider Implementation

  • Crawl pages and links of a web application
  • Parse HTML to get interface information
  • Extract <form> and <input> elements
  • Record default values
  • Based on OWASP WebScarab Project
  • Widely used code-base
  • Actively maintained
slide-33
SLIDE 33

Evaluation Subjects

Subject LOC Servlets Bookstore 19,402 28 Checkers 5,415 33 Classifieds 10,702 19 Employee Directory 5,529 11 Events 7,164 13 Office Talk 4,670 38 Portal 16,089 28

slide-34
SLIDE 34

Research Question 1 — Results

Number of Discovered Interfaces

5 10 15 20 25 30 35 B

  • k

s t

  • r

e C h e c k e r s C l a s s i f i e d s O f f i c e T a l k P

  • r

t a l E m p l

  • y

e e D i r . E v e n t s # Interfaces spider wam

slide-35
SLIDE 35

Research Question 2: Compare Coverage

  • 1. Instrument web applications
  • Statement
  • Branch
  • Database Command-form
  • 2. Generate test inputs with interface

information

  • 3. Run test inputs against applications
slide-36
SLIDE 36

Block Coverage 20 40 60 80 100 Bookstore Checkers Classifieds Employee Dir. Events Portal Office Talk Percent Coverage

Spider WAM

Research Question 2 – Results

Average increase: 30%

slide-37
SLIDE 37

Branch Coverage 20 40 60 80 100 Bookstore Checkers Classifieds Employee Dir. Events Portal Office Talk Percent Coverage

Spider WAM

Research Question 2 – Results

Average increase: 48%

slide-38
SLIDE 38

Database Command-form Coverage 20 40 60 80 100 120 140 160 180 Bookstore Checkers Classifieds Employee Dir. Events Portal Office Talk # of Command-forms

Spider WAM

Research Question 2 – Results

Average increase: 94%

slide-39
SLIDE 39

Conclusions & Future Work

  • Fully automated static analysis technique for

discovering web application interfaces

  • Empirical evaluation against Spider
  • Discovered higher number of interfaces
  • Led to test inputs with higher coverage
  • Future work includes:
  • Apply symbolic execution to improve domain

information

  • Improve automated modeling of web applications
slide-40
SLIDE 40

Questions?