SlideShare a Scribd company logo
1 of 22
Testing and Validating End User
Programmed Calculated Fields
Diego Garbervetsky* Víctor Braberman* Javier Godoy* Sebastian Uchitel*§
Guido de CasoΩ Ignacio PerezΩ Santiago PerezΩ
*ICC, UBA/CONICET, §Imperial College London, ΩMedallia Inc.
•Company specialized in customer
experience management
•Manages billons of surveys
• Automotive, Retail, Hotels, Tech, etc.
•Business intelligence
Persistent
storage
Feedback
collection
mechanisms
Feedback
processing
pipeline
Text analytics
Alert processing
In-memory engine
loader
In-memory query
engine
Survey
takers
Professional
Services
Administration
interface
Configures
calculated fields
Source of truth for
non-calculated fields
Materializes the
calculated fields in the
in-memory engine
Completes
surveys /
reviews
Listens for new
feedback and triggers
various stages
Offers configuration capabilities,
including the creation and
testing of new calculated fields
Performs
queries
End User Programmed Calculated fields
• Implemented by domain experts
• But not skilled developers
• Intricated conditions on database columns
• Error Prone
Professional Services
DSL
Library
(string + integer
manipulation + Medallia
specific functions)
Surveys DB
VM
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
Customer
DSL
Validating calculated fields programs
Random sampling from surveys database
Business Analyst validates program output for randomly selected registers
Coverage metrics for termination
id name points … CF_Point
s
123 John 200290 4
188 Alice 89000 2
…
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
Test
Execution
{output,
coverage}
Random row
sampling
Row# Row
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
Inefficient: more cases to be validated
and less coverage
Can we do something more systematic
than random sampling?
Symbolic Exec Engine
SMT
Test Case
Execution
inputs {output,
coverage}
DSL
Potential approach: symbolic/concolic execution
• Exec with random input
• Collect path condition
• Generate new input using SMT-solver
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
Path
Generation
DSL
Library
PC : points= null
Model(!PC) = points=0
PC : points != null ∧ points <= 400000 ∧
points <= 200000 ∧ points <= 100000…
Model(!PC) = points=400001
Symbolic Exec Engine
SMT
Test Case
Execution
inputs {output,
coverage}
DSL
Potential approach: symbolic/concolic execution
• Exec with random input
• Collect path condition
• Generate new input using SMT-solver
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
Limitation: Inputs that are not real, may be difficult to interpret,
violate tacit invariants, etc.
id name points …
1 xxxx null
1 xxxx 0
…
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
Path
Generation
DSL
Library
Symbolic Execution + Real Data
Hypothesis: Large databases may have enough registers (inputs) to contain
one example for each path condition used in practice
SMT+Symbolic
Exec
Test Case
Generation
PC {output,
coverage}
PC2Query
Translator
queries input
DSL (JS)
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
id name points …
123 John 200290
DSL
Library
row.points < 400001
∧ row.points > 200000
SELECT * FROM row
WHERE row.points <
400001
AND 200000 < row.points
Test1 {
row.points = 200001;
CF_Points(row)
}
Problems in practice
• PC “polluted” with implementation details in library code
SMT+Symbolic
Exec
Test CasesPC {output,
coverage}
PC2Query
Translator
queries input
DSL (JS)
function Years(Date d1, Date d2) {
…
}
Type Date = <dateData: long, ..>
function CF_Age(row) {
var age = Years(lastSeen, signupDate);
if(age>3)
var hours = ParseInt(substr(travel_hours, 10));
}
DSL
Library
... ∧ (((4611686018427387903uL &
(13835058055282163712uL^row.lastSeen.dateData)) -
(4611686018427387903uL &
(13835058055282163712uL^row.signupDate.dateData)))
/864000000000L) / 365 <3
DSL
Library
Problems in practice
• Loops may generate unbounded PCs
• Call to native methods
SMT+Symbolic
Exec
Test CasesPC {output,
coverage}
PC2Query
Translator
queries input
DSL (JS)
function CF_Age(row) {
var age = Years(lastSeen, signupDate);
if(age>3)
var hours = ParseInt(substr(travel_hours, 10));
}
function ParserInt(Sring s) {
…
while(...) {
res += 10*ord(s[i])…
}
…
}
… travel_hours[0] = ord(…) … ∧ travel_hours[1] = xxx & yyy
∧ travel_hours[2]= … ∧ travel_hours[3] …
DSL
Library
DSL
Library
Approach
Observation:
• End user Programs are typically simple code with no loops
• DSL Library has loops, data type definitions,
calls on native methods
Key idea: Hybrid Symbolic + DB engine reasoning
• Keep SMT+Symbolic reasoning only at the end user DSL level.
• i.e., Do not interpret calls on library.
• Translate high level PC to DB queries
• i.e., Implement DSL library methods using DB Store procedures
Hypothesis
• All non-interpreted calls can be mapped onto stored procedures
• DB engine is fast enough to solve queries with stored procedures
DSL
DSL
Library
Surveys DB
VM
function CF_Points(row) {
var points = row.points;
if (points == null) return null;
if (points > 400000) return 5; // Platinum
if (points > 200000) return 4; // Gold
if (points > 100000) return 3; // Silver
if (points > 50000) return 2; // Frequent
return 1; // Basic
}
function CF_Age(row) {
var age = Years(lastSeen, signupDate);
if(age>3)
var hours = ParseInt(substr(travel_hours, 10));
…
}
function CF_Age(row) {
var age = Years(row.lastSeen, row.signupDate);
if(age>3) …
}
... ∧ (((4611686018427387903uL &
(13835058055282163712uL^row.lastSeen.dateData))
- (4611686018427387903uL &
(13835058055282163712uL^row.signupDate.dateData
))) /864000000000L) / 365 <3 …
function Years(Date d1, Date d2) {
…
}
Type Date = long
DSL
Library
function CF_Age(row) {
var age = Years(row.lastSeen, row.signupDate);
if(age>3) …
}
… row.lastSeen!=null ∧ row.signupDate!=null
... ∧ Years(row.lastSeen, row.signupDate) <3
function Years(Date d1, Date d2) {
…
}
Type Date = long
SELECT * FROM row WHERE …
AND row.signupDate NOTNULL
AND row.lastSeen NOTNULL
AND Years(lastSeen, signupDate) < 3 limit 1
Uninterpreted
Years(Date d1, Date d2)
DSL
Library
CREATE FUNCTION Years(d1 date, d2
date)
RETURNS integer AS $$
BEGIN
…
END;
function IsPlatinum(row){
return
IsPlatinum(row,CF_ComputePointsReqForCountry(row));
}
function IsPlatinum(row, pointsForPlatinum) {
var points = row.lastPoints.split(';’);
if (points.Length < row.numDays) return 0;
var isPlatinum = true;
for(i = 0; i < row.numDays; i++) {
var calcPoint = int.Parse(points[i]);
isPlatinum = isPlatinum && (calcPoint >
pointsForPlatinum);
}
if (isPlatinum) return 1;
return 0;
}
function CF_ComputePointsReqForCountry(row) {
if (row.countryCode==null) return null;
if (row.countryCode==1 || row.countryCode==44) return
150000;
if (row.countryCode==54 || row.countryCode==55) return
250000;
return null
}
…
function IsPlatinum(row){
return
IsPlatinum(row,CF_ComputePointsReqForCountry(row));
}
function IsPlatinum(row, pointsForPlatinum) {
var points = row.lastPoints.split(';’);
if (points.Length < row.numDays) return 0;
var isPlatinum = true;
for(i = 0; i < row.numDays; i++) {
var calcPoint = int.Parse(points[i]);
isPlatinum = isPlatinum && (calcPoint >
pointsForPlatinum);
}
if (isPlatinum) return 1;
return 0;
}
function CF_ComputePointsReqForCountry(row) {
if (row.countryCode==null) return null;
if (row.countryCode==1 || row.countryCode==44) return
150000;
if (row.countryCode==54 || row.countryCode==55) return
250000;
return null
}
…
... ∧ row.lastPoints !=null ∧ row.numDays !=
null ∧ 1 <row.numDays ∧ row.countryCode != null
∧ row.countryCode = 1 ∧ IsPlatinum(row, 150000)
= 1
SELECT * FROM row
WHERE row.countryCode = 1 …
AND IsPlatinum(row, 150000) == 1
Fast filtering using
DB indices
Uninterpreted IsPlatinum(row, points)
Applied over a
reduced set of
records
Protoype
• PEX for Symbolic Engine: C# + uninterpreted function for DSL Library
• SQL for BD: Store procedure implementation of DSL Library
PEX
Test Cases
{PCs}
{output,
coverage}
PC2Query
Translator
{Queries +
Stored
Procedures}
{input}
C# + annotations for
uninterpreted functions
JS-2-C#
(systematic)
DSL (JS) Synthetic inputs
DSL
Library
DSL-2-
StoreProcedure
Evaluation: subjects
Anonymized BD with ˜21K records for internal product database
9 user anonymized end user programs
• Inputs: integer, floats and strings.
• Outputs: enumerated types, integers and strings
• Invokes Medallia library and VM methods
• lookups on auxiliary tables, regular expression for searching over strings, etc.
• Many nested ifs, null-checks  intricated code
Findings
• ✔️ High coverage
• ✔️ Few inputs
(Random sampling requires >50% #rows)
• No row in DB to cover one PC in CF_4
• 😱 It was due to a bug and not due to
incomplete DB
Lessons learnt
• Symbolic execution is feasible under
certain scenarios (end user programs +
uninterpreted library calls)
• Databases can be a valid alternative to
SMT solving for meaningful test case
generation
• An optimized search over a database can
be better than solving a complex path
condition.
Next steps
•Automate steps in prototype
•Delegate completely next round
of evaluation
•Full implementation
Questions?

More Related Content

What's hot

Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...
Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...
Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...Victor Rentea
 
The Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable DesignThe Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable DesignVictor Rentea
 
Dzanan_Bajgoric_C2CUDA_MscThesis_Present
Dzanan_Bajgoric_C2CUDA_MscThesis_PresentDzanan_Bajgoric_C2CUDA_MscThesis_Present
Dzanan_Bajgoric_C2CUDA_MscThesis_PresentDžanan Bajgorić
 
05. Java Loops Methods and Classes
05. Java Loops Methods and Classes05. Java Loops Methods and Classes
05. Java Loops Methods and ClassesIntro C# Book
 
Introduction to C#
Introduction to C#Introduction to C#
Introduction to C#ANURAG SINGH
 
12. Java Exceptions and error handling
12. Java Exceptions and error handling12. Java Exceptions and error handling
12. Java Exceptions and error handlingIntro C# Book
 
TypeScript Presentation - Jason Haffey
TypeScript Presentation - Jason HaffeyTypeScript Presentation - Jason Haffey
TypeScript Presentation - Jason HaffeyRalph Johnson
 
45 aop-programming
45 aop-programming45 aop-programming
45 aop-programmingdaotuan85
 
20.1 Java working with abstraction
20.1 Java working with abstraction20.1 Java working with abstraction
20.1 Java working with abstractionIntro C# Book
 
EdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaEdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaLisa Hua
 
20.4 Java interfaces and abstraction
20.4 Java interfaces and abstraction20.4 Java interfaces and abstraction
20.4 Java interfaces and abstractionIntro C# Book
 
Final JAVA Practical of BCA SEM-5.
Final JAVA Practical of BCA SEM-5.Final JAVA Practical of BCA SEM-5.
Final JAVA Practical of BCA SEM-5.Nishan Barot
 
Bca 2nd sem u-2 classes & objects
Bca 2nd sem u-2 classes & objectsBca 2nd sem u-2 classes & objects
Bca 2nd sem u-2 classes & objectsRai University
 

What's hot (16)

Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...
Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...
Definitive Guide to Working With Exceptions in Java - takj at Java Champions ...
 
OOP v3
OOP v3OOP v3
OOP v3
 
The Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable DesignThe Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable Design
 
Dzanan_Bajgoric_C2CUDA_MscThesis_Present
Dzanan_Bajgoric_C2CUDA_MscThesis_PresentDzanan_Bajgoric_C2CUDA_MscThesis_Present
Dzanan_Bajgoric_C2CUDA_MscThesis_Present
 
05. Java Loops Methods and Classes
05. Java Loops Methods and Classes05. Java Loops Methods and Classes
05. Java Loops Methods and Classes
 
Introduction to C#
Introduction to C#Introduction to C#
Introduction to C#
 
12. Java Exceptions and error handling
12. Java Exceptions and error handling12. Java Exceptions and error handling
12. Java Exceptions and error handling
 
TypeScript Presentation - Jason Haffey
TypeScript Presentation - Jason HaffeyTypeScript Presentation - Jason Haffey
TypeScript Presentation - Jason Haffey
 
Constructor and destructor in C++
Constructor and destructor in C++Constructor and destructor in C++
Constructor and destructor in C++
 
45 aop-programming
45 aop-programming45 aop-programming
45 aop-programming
 
20.1 Java working with abstraction
20.1 Java working with abstraction20.1 Java working with abstraction
20.1 Java working with abstraction
 
EdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaEdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for Java
 
Advanced JavaScript
Advanced JavaScript Advanced JavaScript
Advanced JavaScript
 
20.4 Java interfaces and abstraction
20.4 Java interfaces and abstraction20.4 Java interfaces and abstraction
20.4 Java interfaces and abstraction
 
Final JAVA Practical of BCA SEM-5.
Final JAVA Practical of BCA SEM-5.Final JAVA Practical of BCA SEM-5.
Final JAVA Practical of BCA SEM-5.
 
Bca 2nd sem u-2 classes & objects
Bca 2nd sem u-2 classes & objectsBca 2nd sem u-2 classes & objects
Bca 2nd sem u-2 classes & objects
 

Similar to Testing and Validating End User Programmed Calculated Fields

How Data Flow analysis works in a static code analyzer
How Data Flow analysis works in a static code analyzerHow Data Flow analysis works in a static code analyzer
How Data Flow analysis works in a static code analyzerAndrey Karpov
 
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...Data Con LA
 
Java Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey KovalenkoJava Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey KovalenkoValeriia Maliarenko
 
RailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMsRailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMsLourens Naudé
 
The IoT Academy IoT Training Arduino Part 3 programming
The IoT Academy IoT Training Arduino Part 3 programmingThe IoT Academy IoT Training Arduino Part 3 programming
The IoT Academy IoT Training Arduino Part 3 programmingThe IOT Academy
 
FUNCTIONS, CLASSES AND OBJECTS.pptx
FUNCTIONS, CLASSES AND OBJECTS.pptxFUNCTIONS, CLASSES AND OBJECTS.pptx
FUNCTIONS, CLASSES AND OBJECTS.pptxDeepasCSE
 
Node.js behind: V8 and its optimizations
Node.js behind: V8 and its optimizationsNode.js behind: V8 and its optimizations
Node.js behind: V8 and its optimizationsDawid Rusnak
 
Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”Platonov Sergey
 
Lecture#6 functions in c++
Lecture#6 functions in c++Lecture#6 functions in c++
Lecture#6 functions in c++NUST Stuff
 
Query optimizer vivek sharma
Query optimizer vivek sharmaQuery optimizer vivek sharma
Query optimizer vivek sharmaaioughydchapter
 
Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...
Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...
Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...Databricks
 
Data Wars: The Bloody Enterprise strikes back
Data Wars: The Bloody Enterprise strikes backData Wars: The Bloody Enterprise strikes back
Data Wars: The Bloody Enterprise strikes backVictor_Cr
 
Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨flyinweb
 
Domain Specific Languages In Scala Duse3
Domain Specific Languages In Scala Duse3Domain Specific Languages In Scala Duse3
Domain Specific Languages In Scala Duse3Peter Maas
 
Optimization in Programming languages
Optimization in Programming languagesOptimization in Programming languages
Optimization in Programming languagesAnkit Pandey
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come FromMin-Yih Hsu
 
ch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.pptch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.pptMahyuddin8
 
ch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.pptch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.pptghoitsun
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityBrendan Gregg
 

Similar to Testing and Validating End User Programmed Calculated Fields (20)

How Data Flow analysis works in a static code analyzer
How Data Flow analysis works in a static code analyzerHow Data Flow analysis works in a static code analyzer
How Data Flow analysis works in a static code analyzer
 
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
 
Java Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey KovalenkoJava Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey Kovalenko
 
lecture56.ppt
lecture56.pptlecture56.ppt
lecture56.ppt
 
RailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMsRailswayCon 2010 - Dynamic Language VMs
RailswayCon 2010 - Dynamic Language VMs
 
The IoT Academy IoT Training Arduino Part 3 programming
The IoT Academy IoT Training Arduino Part 3 programmingThe IoT Academy IoT Training Arduino Part 3 programming
The IoT Academy IoT Training Arduino Part 3 programming
 
FUNCTIONS, CLASSES AND OBJECTS.pptx
FUNCTIONS, CLASSES AND OBJECTS.pptxFUNCTIONS, CLASSES AND OBJECTS.pptx
FUNCTIONS, CLASSES AND OBJECTS.pptx
 
Node.js behind: V8 and its optimizations
Node.js behind: V8 and its optimizationsNode.js behind: V8 and its optimizations
Node.js behind: V8 and its optimizations
 
Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”
 
Lecture#6 functions in c++
Lecture#6 functions in c++Lecture#6 functions in c++
Lecture#6 functions in c++
 
Query optimizer vivek sharma
Query optimizer vivek sharmaQuery optimizer vivek sharma
Query optimizer vivek sharma
 
Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...
Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...
Analyzing the Performance Effects of Meltdown + Spectre on Apache Spark Workl...
 
Data Wars: The Bloody Enterprise strikes back
Data Wars: The Bloody Enterprise strikes backData Wars: The Bloody Enterprise strikes back
Data Wars: The Bloody Enterprise strikes back
 
Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨
 
Domain Specific Languages In Scala Duse3
Domain Specific Languages In Scala Duse3Domain Specific Languages In Scala Duse3
Domain Specific Languages In Scala Duse3
 
Optimization in Programming languages
Optimization in Programming languagesOptimization in Programming languages
Optimization in Programming languages
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come From
 
ch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.pptch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.ppt
 
ch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.pptch02-primitive-data-definite-loops.ppt
ch02-primitive-data-definite-loops.ppt
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF Observability
 

Recently uploaded

What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxwendy cai
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSCAESB
 
Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxupamatechverse
 
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝soniya singh
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escortsranjana rawat
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile servicerehmti665
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxAsutosh Ranjan
 
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICSHARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICSRajkumarAkumalla
 
High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...
High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...
High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...Call Girls in Nagpur High Profile
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
Current Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLCurrent Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLDeelipZope
 
Microscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxMicroscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxpurnimasatapathy1234
 
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINEMANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINESIVASHANKAR N
 
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Serviceranjana rawat
 
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSMANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSSIVASHANKAR N
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSKurinjimalarL3
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130Suhani Kapoor
 

Recently uploaded (20)

What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptx
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentation
 
9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf
9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf
9953056974 Call Girls In South Ex, Escorts (Delhi) NCR.pdf
 
Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptx
 
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile service
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICSHARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
 
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
 
High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...
High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...
High Profile Call Girls Nashik Megha 7001305949 Independent Escort Service Na...
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
Current Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLCurrent Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCL
 
Microscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxMicroscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptx
 
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINEMANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
 
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
 
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSMANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
 
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINEDJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
 

Testing and Validating End User Programmed Calculated Fields

  • 1. Testing and Validating End User Programmed Calculated Fields Diego Garbervetsky* Víctor Braberman* Javier Godoy* Sebastian Uchitel*§ Guido de CasoΩ Ignacio PerezΩ Santiago PerezΩ *ICC, UBA/CONICET, §Imperial College London, ΩMedallia Inc.
  • 2. •Company specialized in customer experience management •Manages billons of surveys • Automotive, Retail, Hotels, Tech, etc. •Business intelligence
  • 3. Persistent storage Feedback collection mechanisms Feedback processing pipeline Text analytics Alert processing In-memory engine loader In-memory query engine Survey takers Professional Services Administration interface Configures calculated fields Source of truth for non-calculated fields Materializes the calculated fields in the in-memory engine Completes surveys / reviews Listens for new feedback and triggers various stages Offers configuration capabilities, including the creation and testing of new calculated fields Performs queries
  • 4. End User Programmed Calculated fields • Implemented by domain experts • But not skilled developers • Intricated conditions on database columns • Error Prone Professional Services DSL Library (string + integer manipulation + Medallia specific functions) Surveys DB VM function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } Customer DSL
  • 5. Validating calculated fields programs Random sampling from surveys database Business Analyst validates program output for randomly selected registers Coverage metrics for termination id name points … CF_Point s 123 John 200290 4 188 Alice 89000 2 … function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } Test Execution {output, coverage} Random row sampling Row# Row function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic }
  • 6. Inefficient: more cases to be validated and less coverage Can we do something more systematic than random sampling?
  • 7. Symbolic Exec Engine SMT Test Case Execution inputs {output, coverage} DSL Potential approach: symbolic/concolic execution • Exec with random input • Collect path condition • Generate new input using SMT-solver function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } Path Generation DSL Library PC : points= null Model(!PC) = points=0 PC : points != null ∧ points <= 400000 ∧ points <= 200000 ∧ points <= 100000… Model(!PC) = points=400001
  • 8. Symbolic Exec Engine SMT Test Case Execution inputs {output, coverage} DSL Potential approach: symbolic/concolic execution • Exec with random input • Collect path condition • Generate new input using SMT-solver function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } Limitation: Inputs that are not real, may be difficult to interpret, violate tacit invariants, etc. id name points … 1 xxxx null 1 xxxx 0 … function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } Path Generation DSL Library
  • 9. Symbolic Execution + Real Data Hypothesis: Large databases may have enough registers (inputs) to contain one example for each path condition used in practice SMT+Symbolic Exec Test Case Generation PC {output, coverage} PC2Query Translator queries input DSL (JS) function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } id name points … 123 John 200290 DSL Library row.points < 400001 ∧ row.points > 200000 SELECT * FROM row WHERE row.points < 400001 AND 200000 < row.points Test1 { row.points = 200001; CF_Points(row) }
  • 10. Problems in practice • PC “polluted” with implementation details in library code SMT+Symbolic Exec Test CasesPC {output, coverage} PC2Query Translator queries input DSL (JS) function Years(Date d1, Date d2) { … } Type Date = <dateData: long, ..> function CF_Age(row) { var age = Years(lastSeen, signupDate); if(age>3) var hours = ParseInt(substr(travel_hours, 10)); } DSL Library ... ∧ (((4611686018427387903uL & (13835058055282163712uL^row.lastSeen.dateData)) - (4611686018427387903uL & (13835058055282163712uL^row.signupDate.dateData))) /864000000000L) / 365 <3 DSL Library
  • 11. Problems in practice • Loops may generate unbounded PCs • Call to native methods SMT+Symbolic Exec Test CasesPC {output, coverage} PC2Query Translator queries input DSL (JS) function CF_Age(row) { var age = Years(lastSeen, signupDate); if(age>3) var hours = ParseInt(substr(travel_hours, 10)); } function ParserInt(Sring s) { … while(...) { res += 10*ord(s[i])… } … } … travel_hours[0] = ord(…) … ∧ travel_hours[1] = xxx & yyy ∧ travel_hours[2]= … ∧ travel_hours[3] … DSL Library DSL Library
  • 12. Approach Observation: • End user Programs are typically simple code with no loops • DSL Library has loops, data type definitions, calls on native methods Key idea: Hybrid Symbolic + DB engine reasoning • Keep SMT+Symbolic reasoning only at the end user DSL level. • i.e., Do not interpret calls on library. • Translate high level PC to DB queries • i.e., Implement DSL library methods using DB Store procedures Hypothesis • All non-interpreted calls can be mapped onto stored procedures • DB engine is fast enough to solve queries with stored procedures DSL DSL Library Surveys DB VM function CF_Points(row) { var points = row.points; if (points == null) return null; if (points > 400000) return 5; // Platinum if (points > 200000) return 4; // Gold if (points > 100000) return 3; // Silver if (points > 50000) return 2; // Frequent return 1; // Basic } function CF_Age(row) { var age = Years(lastSeen, signupDate); if(age>3) var hours = ParseInt(substr(travel_hours, 10)); … }
  • 13. function CF_Age(row) { var age = Years(row.lastSeen, row.signupDate); if(age>3) … } ... ∧ (((4611686018427387903uL & (13835058055282163712uL^row.lastSeen.dateData)) - (4611686018427387903uL & (13835058055282163712uL^row.signupDate.dateData ))) /864000000000L) / 365 <3 … function Years(Date d1, Date d2) { … } Type Date = long DSL Library
  • 14. function CF_Age(row) { var age = Years(row.lastSeen, row.signupDate); if(age>3) … } … row.lastSeen!=null ∧ row.signupDate!=null ... ∧ Years(row.lastSeen, row.signupDate) <3 function Years(Date d1, Date d2) { … } Type Date = long SELECT * FROM row WHERE … AND row.signupDate NOTNULL AND row.lastSeen NOTNULL AND Years(lastSeen, signupDate) < 3 limit 1 Uninterpreted Years(Date d1, Date d2) DSL Library CREATE FUNCTION Years(d1 date, d2 date) RETURNS integer AS $$ BEGIN … END;
  • 15. function IsPlatinum(row){ return IsPlatinum(row,CF_ComputePointsReqForCountry(row)); } function IsPlatinum(row, pointsForPlatinum) { var points = row.lastPoints.split(';’); if (points.Length < row.numDays) return 0; var isPlatinum = true; for(i = 0; i < row.numDays; i++) { var calcPoint = int.Parse(points[i]); isPlatinum = isPlatinum && (calcPoint > pointsForPlatinum); } if (isPlatinum) return 1; return 0; } function CF_ComputePointsReqForCountry(row) { if (row.countryCode==null) return null; if (row.countryCode==1 || row.countryCode==44) return 150000; if (row.countryCode==54 || row.countryCode==55) return 250000; return null } …
  • 16. function IsPlatinum(row){ return IsPlatinum(row,CF_ComputePointsReqForCountry(row)); } function IsPlatinum(row, pointsForPlatinum) { var points = row.lastPoints.split(';’); if (points.Length < row.numDays) return 0; var isPlatinum = true; for(i = 0; i < row.numDays; i++) { var calcPoint = int.Parse(points[i]); isPlatinum = isPlatinum && (calcPoint > pointsForPlatinum); } if (isPlatinum) return 1; return 0; } function CF_ComputePointsReqForCountry(row) { if (row.countryCode==null) return null; if (row.countryCode==1 || row.countryCode==44) return 150000; if (row.countryCode==54 || row.countryCode==55) return 250000; return null } … ... ∧ row.lastPoints !=null ∧ row.numDays != null ∧ 1 <row.numDays ∧ row.countryCode != null ∧ row.countryCode = 1 ∧ IsPlatinum(row, 150000) = 1 SELECT * FROM row WHERE row.countryCode = 1 … AND IsPlatinum(row, 150000) == 1 Fast filtering using DB indices Uninterpreted IsPlatinum(row, points) Applied over a reduced set of records
  • 17. Protoype • PEX for Symbolic Engine: C# + uninterpreted function for DSL Library • SQL for BD: Store procedure implementation of DSL Library PEX Test Cases {PCs} {output, coverage} PC2Query Translator {Queries + Stored Procedures} {input} C# + annotations for uninterpreted functions JS-2-C# (systematic) DSL (JS) Synthetic inputs DSL Library DSL-2- StoreProcedure
  • 18. Evaluation: subjects Anonymized BD with ˜21K records for internal product database 9 user anonymized end user programs • Inputs: integer, floats and strings. • Outputs: enumerated types, integers and strings • Invokes Medallia library and VM methods • lookups on auxiliary tables, regular expression for searching over strings, etc. • Many nested ifs, null-checks  intricated code
  • 19. Findings • ✔️ High coverage • ✔️ Few inputs (Random sampling requires >50% #rows) • No row in DB to cover one PC in CF_4 • 😱 It was due to a bug and not due to incomplete DB
  • 20. Lessons learnt • Symbolic execution is feasible under certain scenarios (end user programs + uninterpreted library calls) • Databases can be a valid alternative to SMT solving for meaningful test case generation • An optimized search over a database can be better than solving a complex path condition.
  • 21. Next steps •Automate steps in prototype •Delegate completely next round of evaluation •Full implementation

Editor's Notes

  1. They de-anonymised field names in code and queries and then ran the queries on the production database. While validating the resulting test cases, the end user programmers identified one mismatch between informal requirements and the calculated field program. The mismatch had to that point not been identified. Furthermore, the mismatch was subtle enough that initially end users assumed that there was a problem of the prototype test case generator. Tota; 98% statement coverage, 92% branch coverage