Presentation is loading. Please wait.

Presentation is loading. Please wait.

Verification Aided Regression Testing (VART) Fabrizio Pastore, Leonardo Mariani University of Milano - Bicocca Antti E. J. Hyvarinen, Grigory Fedyukovich,

Similar presentations


Presentation on theme: "Verification Aided Regression Testing (VART) Fabrizio Pastore, Leonardo Mariani University of Milano - Bicocca Antti E. J. Hyvarinen, Grigory Fedyukovich,"— Presentation transcript:

1 Verification Aided Regression Testing (VART) Fabrizio Pastore, Leonardo Mariani University of Milano - Bicocca Antti E. J. Hyvarinen, Grigory Fedyukovich, Natasha Sharygina University of Lugano PINCETTE Stephan Sehestedt ABB Germany Ali Muhammad VTT Finland ISSTA 2014 Accepted

2 Base Program Upgraded Program working no longer working Regression Failures

3 Base Program Upgraded Program Test Case Traditional Regression Testing Test Case Write tests for Base

4 Base Program Upgraded Program Test Case Traditional Regression Testing Test Case Write tests for BaseRe-Execute on Upgraded Execute

5 Base Program Upgraded Program Test Case Traditional Regression Testing Test Case Write tests for BaseRe-Execute on Upgraded Execute PROBLEM: Base Test inputs might not trigger the regression

6 Monitor + Inference Base Program Upgraded Program Test Case Traditional Regression Testing Test Case Execute Properties Model Checking Show Properties Not Valid in Upgraded

7 int isAvailable(node* product){ if ( notInitialized(product) ) return 0; if ( product->items > 0 ) return 1; return 0; } int isAvailable(node* product){ if ( notInitialized(product) ) return 0; if ( product->in_catalog == 0 ) return -1; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; Base VersionUpgraded Version } return total; Base Version: total >= 0 Upgraded Version: total >= 0 FALSE

8 Dynamic Properties for Base Base Program Upgraded Program Tests for Base Monitoring + Inference

9 int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; }

10 AcerAspire MacBookAir Dell total 01 2 return int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items product.name MacBookPro product.items 032 5

11 AcerAspire MacBookAir Dell total 01 2 return int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items product.name MacBookPro product.items 032 5

12 AcerAspire MacBookAir Dell total 01 2 return int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items product.name MacBookPro product.items Inference with Daikon [Ernst et al.] Inference with Daikon [Ernst et al.]

13 AcerAspire MacBookAir Dell total 01 2 return int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items >= 0 product.name MacBookPro product.items Inference with Daikon [Ernst et al.] Inference with Daikon [Ernst et al.]

14 total 01 2 return one of {0,1} 3 return 3 int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items >= 0 product.items Inference with Daikon [Ernst et al.] Inference with Daikon [Ernst et al.] AcerAspire MacBookAir Dell product.name MacBookPro

15 AcerAspire MacBookAir Dell total >= 0 return one of {0,1} return 3 int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items >= 0 product.name MacBookPro product.items Inference with Daikon [Ernst et al.] Inference with Daikon [Ernst et al.]

16 total >= 0 return one of {0,1} return one of {0,3} int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } product.items >= 0 Inference with Daikon [Ernst et al.] Inference with Daikon [Ernst et al.] Overfitting

17 Dynamic Properties for Base Monitoring + Inference Upgraded Program Tests for Base Base Program

18 Verified Properties for Base Verified Properties for Base Dynamic Properties for Base Intra-Version Property Verification Intra-Version Property Verification Monitoring + Inference Tests for Base isAvailable(..) notInitialized(..) drawProductBox(..) main(..) Base Program availableItems(..) {... while (.. ) {.. } assert( total > 0 ) Bounded Model Checker

19 Verified Properties for Base Verified Properties for Base Dynamic Properties for Base Intra-Version Property Verification Intra-Version Property Verification Monitoring + Inference Tests for Base isAvailable(..) notInitialized(..) drawProductBox(..) main(..) Base Program availableItems(..) {... while (.. ) {.. } assert( total > 0 ) EvolCheck function summaries

20 int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } total >= 0 return one of {0,1} return one of {2, 3} product.items >= 0

21 int isAvailable(node* product){ assert( product->items >= 0 ) if ( notInitialized (product) ) return 0; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } total >= 0 return one of {0,1} return one of {2, 3}

22 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } total >= 0 return one of {2, 3} int isAvailable(node* product){ assert( product->items >= 0 ) if ( notInitialized (product) ) { int ret_0=0; assert(ret_0 == 0 || ret_0 == 1); return ret_0; } if ( product->items > 0 ) { int ret_1=0; assert(ret_1 == 0 || ret_0 == 1); return ret_1; } int ret_2=0; assert(ret_2 == 0 || ret_2 == 1); return ret_2; }

23 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } return total; } return one of {2, 3} int isAvailable(node* product){ assert( product->items >= 0 ) if ( notInitialized (product) ) { int ret_0=0; assert(ret_0 == 0 || ret_0 == 1); return ret_0; } if ( product->items > 0 ) { int ret_1=0; assert(ret_1 == 0 || ret_0 == 1); return ret_1; } int ret_2=0; assert(ret_2 == 0 || ret_2 == 1); return ret_2; }

24 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } long ret_0 = total; assert (ret_0 == 0 || ret_0 == 3); return ret_0; } int isAvailable(node* product){ assert( product->items >= 0 ) if ( notInitialized (product) ) { int ret_0=0; assert(ret_0 == 0 || ret_0 == 1); return ret_0; } if ( product->items > 0 ) { int ret_1=0; assert(ret_1 == 0 || ret_0 == 1); return ret_1; } int ret_2=0; assert(ret_2 == 0 || ret_2 == 1); return ret_2; }

25 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } long ret_0 = total; assert (ret_0 == 0 || ret_0 == 3); return ret_0; } Execute Model Checker on source with assertions int isAvailable(node* product){ assert( product->items >= 0 ) if ( notInitialized (product) ) { int ret_0=0; assert(ret_0 == 0 || ret_0 == 1); return ret_0; } if ( product->items > 0 ) { int ret_1=0; assert(ret_1 == 0 || ret_0 == 1); return ret_1; } int ret_2=0; assert(ret_2 == 0 || ret_2 == 1); return ret_2; } Verified Unreachable False Unknown classifies

26 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } long ret_0 = total; assert (ret_0 == 0 || ret_0 == 3); return ret_0; } int isAvailable(node* product){ assert( product->items >= 0 ) if ( notInitialized (product) ) { int ret_0=0; assert(ret_0 == 0 || ret_0 == 1); return ret_0; } if ( product->items > 0 ) { int ret_1=0; assert(ret_1 == 0 || ret_0 == 1); return ret_1; } int ret_2=0; assert(ret_2 == 0 || ret_2 == 1); return ret_2; } Verified Properties for Base Verified Properties for Base Execute Model Checker on source with assertions Verified Unreachable False Unknown classifies

27 Verified Properties for Base Verified Properties for Base Dynamic Properties for Base Intra-Version Property Verification Intra-Version Property Verification Monitoring + Inference Tests for Base Phase 2: Checking Base Program

28 Verified Properties for Base Verified Properties for Base Dynamic Properties for Base Intra-Version Property Verification Intra-Version Property Verification Base Program Monitoring + Inference Upgraded Program Monitoring + Filtering Non-Regression Properties Tests for Base Tests for Upgrade Phase 2: Checking Verified Properties for Base Verified Properties for Base Outdated Properties Outdated Properties DISCARD

29 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0;return -1; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Base Upgrade

30 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; return -1; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Base Upgrade

31 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; return -1; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Base Upgrade return one of {0,1} product->items >= 0 total >=

32 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; return -1; if ( product->items > 0 ) return 1; return 0; } long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Base Upgrade return one of {0,1} product->items >= 0 total >=

33 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } return one of {0,1} product->items >= 0 total >= 0 void testNotInCatalog(){ list_node* prod = create_product(); prod->name = “MacBook”; prod->in_catalog = 0; assertEquals(-1,isAvailable(prod)); } Test for the upgrade Upgrade

34 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); product = product->nxt; } return total; } void testNotInCatalog(){ list_node* prod = create_product(); prod->name = “MacBook”; prod->in_catalog = 0; assertEquals(-1,isAvailable(prod)); } Test for the upgrade int isAvailable(node* product){ if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } return one of {0,1} product->items >= 0 total >= 0 product.items 0 product.in_catalog0 return product.nameMacBook Upgrade

35 Verified Properties for Base Verified Properties for Base Dynamic Properties for Base Intra-Version Property Verification Intra-Version Property Verification Base Program Monitoring + Inference Monitoring + Filtering Non-Regression Properties Tests for Base Tests for Upgrade Phase 2: Checking Verified Properties for Base Verified Properties for Base Upgraded Program

36 Verified Properties for Base Verified Properties for Base Dynamic Properties for Base Intra-Version Property Verification Intra-Version Property Verification Regression Problems + Counterexamples Inter-Version Property Verification Inter-Version Property Verification Base Program Monitoring + Inference Monitoring + Filtering Non-Regression Properties Tests for Base Tests for Upgrade Phase 2: Checking Verified Properties for Base Verified Properties for Base Upgraded Program

37 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } return total; } int isAvailable(node* product){ assert( product->items >= 0 ); if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } classifies

38 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } return total; } int isAvailable(node* product){ assert( product->items >= 0 ); if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Verified False Unreachable Unknown Execute Model Checker on source with assertions classifies

39 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } return total; } int isAvailable(node* product){ assert( product->items >= 0 ); if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Verified False Unreachable Unknown Execute Model Checker on source with assertions classifies FALSE Presented to developers

40 long availableProducts( t_store* store ){ node* product = store->products; long total = 0; while ( product != 0 ) { total += isAvailable( product ); assert( total >= 0 ); product = product->nxt; } return total; } int isAvailable(node* product){ assert( product->items >= 0 ); if ( notInitialized (product) ) return 0; if ( notInCatalog (product) ) return -1; if ( product->items > 0 ) return 1; return 0; } Verified False Unreachable Unknown Execute Model Checker on source with assertions classifies FALSE Presented to developers

41 Dynamic Properties for Base Verified Properties for Base Verified Properties for Base Intra-Version Property Verification Intra-Version Property Verification Base Program Monitoring + Inference Upgraded Program Tests for Base Regression Problems + Counterexamples Inter-Version Property Verification Inter-Version Property Verification Monitoring + Filtering Non-Regression Properties Tests for Upgrade Verified Properties for Base Verified Properties for Base

42 Console VersionEclipse GUI Tool Implementation

43 Empirical Validation Effectiveness wrt Test Coverage Effectiveness with Regression Faults not covered by Test Suites

44 Effectiveness wrt Test Coverage High CoverageLow Coverage Complete Properties Extensive Tests Poor Properties Poor Tests

45 Effectiveness vs Test Coverage GREP, 871 Test Cases Faulty Versions of GREP from Software-artifacts Infrastructure Repository (SIR) Selected all the faulty versions derived from GREP v3 and v4, with faults covered by test cases High CoverageLow Coverage Complete Properties Extensive Tests Poor Properties Poor Tests

46 Fault IDBase VersionUpgrade VersionChange Size v3 DG1010/6/ :44:13 10/6/1999 1:13: v3 KP2 v3 KP9 v3 DG18/13/ :45:21 8/13/ :02: v3 DG8 v3 KP7 v3 DG310/07/1999 3:42:57 10/12/1999 4:11: v3 DG2 v4 KP81/21/2000 2:22:47 1/25/2000 3:34: v4 DG3 v4 KP61/17/2000 0:55:06 1/20/2000 4:43:03 89

47 Fault IDBase VersionUpgrade VersionChange Size v3 DG1010/6/ :44:13 10/6/1999 1:13: v3 KP2 v3 KP9 v3 DG18/13/ :45:21 8/13/ :02: v3 DG8 v3 KP7 v3 DG310/07/1999 3:42:57 10/12/1999 4:11: v3 DG2 v4 KP81/21/2000 2:22:47 1/25/2000 3:34: v4 DG3 v4 KP61/17/2000 0:55:06 1/20/2000 4:43:03 89 Faulty Version of GREP from SIR repository case ‘+‘: return PLUS; case ‘{‘: c=FETCH(); if ( ! ISASCIIDIGIT (c) ) minrep = c - '0';... case ‘<’: return BEGWORD; Deriving Regressions

48 Fault IDBase VersionUpgrade VersionChange Size v3 DG1010/6/ :44:13 10/6/1999 1:13: v3 KP2 v3 KP9 v3 DG18/13/ :45:21 8/13/ :02: v3 DG8 v3 KP7 v3 DG310/07/1999 3:42:57 10/12/1999 4:11: v3 DG2 v4 KP81/21/2000 2:22:47 1/25/2000 3:34: v4 DG3 v4 KP61/17/2000 0:55:06 1/20/2000 4:43:03 89 Faulty Version of GREP from SIR repository case ‘+‘: return PLUS; case ‘{‘: c=FETCH(); if ( ! ISASCIIDIGIT (c) ) minrep = c - '0';... case ‘<’: return BEGWORD; Most Recent Change from GREP repository case ‘+‘: return PLUS; case ‘{‘: c=FETCH(); if ( ISASCIIDIGIT (c) ) minrep = c - '0';... case ‘<’: return BEGWORD; case ‘+‘: return PLUS; case ‘<’: return BEGWORD; + injected fault ! Base Upgrade Deriving Regressions

49 Fault IDBase VersionUpgrade VersionChange Size v3 DG1010/6/ :44:13 10/6/1999 1:13: v3 KP2 v3 KP9 v3 DG18/13/ :45:21 8/13/ :02: v3 DG8 v3 KP7 v3 DG310/07/1999 3:42:57 10/12/1999 4:11: v3 DG2 v4 KP81/21/2000 2:22:47 1/25/2000 3:34: v4 DG3 v4 KP61/17/2000 0:55:06 1/20/2000 4:43:03 89

50 TC1TC2TC3TC4...TC817 ✔

51 FunctionsTC1TC2TC3TC4...TC817 copy(..)branch1 ✔ branch2 ✔ branch3 ✔✔✔ lex(..)branch1 ✔ branch2 ✔✔✔ branch3 ✔ main(..)branch1 ✔✔✔ branch2... ✔ MINIMAL REGRESSION TEST SUITE Modified

52 Incremental Coverage 20% 50% 20%50%MRT (75%) TC1TC817TC3 TC..

53 CoverageIdentified FaultsProperty Violations Fault IDRegression Testing VAR T TPFP Coverage 20%3550 Coverage 50%7820 Minimal Regression Test Suite (coverage 75%)

54 Coverage20%50%MRT Fault IDTestVARTTestVARTTestVART v3 DG v3 KP v3 KP v3 DG v3 DG v3 KP v3 DG v3 DG v4 KP v4 DG v4 KP

55 Effectiveness with Regression Faults Not Covered by Test Suites VTT: Motion Trajectory Controller

56 SubjectSize (LOC) BaseUpgradeTest Suite Size VTT VTT: Motion Trajectory Controller VTT: Motion Trajectory Controller Effectiveness with Regression Faults Not Covered by Test Suites

57 SubjectSize (LOC) BaseUpgradeTest Suite Size VTT ABB ABB ABB VTT: Motion Trajectory Controller ABB: Protection Function Effectiveness with Regression Faults Not Covered by Test Suites

58 SubjectSize (LOC) BaseUpgradeTest Suite Size VTT ABB ABB ABB SORT465320/06/201202/07/ GREP59001/17/200101/20/ VTT: Motion Trajectory Controller Effectiveness with Regression Faults Not Covered by Test Suites

59 SubjectDynamic Properties Non-Regression Properties Property Violations TPFPPrecision VTT ABB ABB ABB SORT GREP

60 Pre- and Post-conditions catch illegal uses of functions

61 New code with wrong use of base function stream_open (char const *file,... if (*how == 'r’) {... } return fopen (file, how); } else if (*how == 'w’) { if (ftruncate (outfd, 0) != 0) error (EXIT_FAILURE, errno, _("%s: error truncating"), quote (file)); fp = fdopen (outfd, how); stream_open (char const *file,... if (*how == 'r’) {... } else if (*how == 'w’) { if (ftruncate (outfd, 0) != 0) error (EXIT_FAILURE,... fp = fdopen (outfd, how); } else return fp; } SORT_FAILURE void error (int status,... assert( status == 0 || status == 2 ); Base Upgrade

62 Unreachable assertions catch errors in branch conditions

63 Missing else: unreachable assertion FETCH(c, _("unfinished repeat count")); if (ISDIGIT(c)) { minrep = c - '0'; for (;;) { FETCH(c, _("unfinished repeat count")); if (!ISDIGIT(c)) break; minrep = 10 * minrep + c - '0'; } dfaerror(_("malformed repeat count")); if (c == ',') if (ISDIGIT(c)) { minrep = c - '0'; for (;;) {... minrep = 10 * minrep + c - '0'; } else if (c == ',’) dfaerror(_("malformed")); if (c == ',’){ for (;;) { if (ISDIGIT(c)) { minrep = c - '0'; for (;;) {... minrep = 10 * minrep + c - '0'; } else dfaerror(_("malformed")); if (c == ',’) {... for (;;) { assert( c >= 44 ); Base Upgrade

64 Assertions identify the variables with wrong assignments

65 Wrong Refactoring status = count; if (list_files == * status) printf ("%s%c", filename, '\n' & filename_mask); if (count) { status = 0; if (list_files == 1) printf ("%s\n", filename); } else { status = 1; if (list_files == -1) printf ("%s\n", filename); } assert( count != status ); assert( status <= 1 ); assert( desc >= 0 ); ! missing Base Upgrade

66

67 Verification Aided Regression Testing (VART) Compensate Low Test Coverage Spot Regressions Hard to Find


Download ppt "Verification Aided Regression Testing (VART) Fabrizio Pastore, Leonardo Mariani University of Milano - Bicocca Antti E. J. Hyvarinen, Grigory Fedyukovich,"

Similar presentations


Ads by Google