cse306 software quality in practice
play

CSE306 Software Quality in Practice Dr. Carl Alphonce - PowerPoint PPT Presentation

CSE306 Software Quality in Practice Dr. Carl Alphonce alphonce@buffalo.edu 343 Davis Hall Recall the rules 1. Understand the requirements 2. Make it fail 3. Simplify the test case 4. Read the right error message 5. Check the plug 6.


  1. CSE306 Software Quality in Practice Dr. Carl Alphonce alphonce@buffalo.edu 343 Davis Hall

  2. Recall the rules 1. Understand the requirements 2. Make it fail 3. Simplify the test case 4. Read the right error message 5. Check the plug 6. Separate fact from fiction 7. Divide and conquer 8. Match the tool to the bug 9. One change at a time 10. Keep an audit trail 11. Get a fresh view 12. If you didn’ t fix it, it ain’ t fixed 13. Cover your bug fix with a regression test

  3. Recall the rules 1. Understand the requirements 2. Make it fail 3. Simplify the test case 4. Read the right error message 5. Check the plug 6. Separate fact from fiction 7. Divide and conquer 8. Match the tool to the bug 9. One change at a time 10. Keep an audit trail 11. Get a fresh view 12. If you didn’ t fix it, it ain’ t fixed 13. Cover your bug fix with a regression test

  4. Recall the rules 1. Understand the requirements 2. Make it fail 3. Simplify the test case 4. Read the right error message 5. Check the plug 6. Separate fact from fiction 7. Divide and conquer 8. Match the tool to the bug 9. One change at a time 10. Keep an audit trail 11. Get a fresh view 12. If you didn’ t fix it, it ain’ t fixed 13. Cover your bug fix with a regression test

  5. Unit testing frameworks uniform way of expressing tests manage tests through suites automate testing process

  6. Remember JUnit?

  7. We'll use CUnit http:/ /cunit.sourceforge.net http:/ /cunit.sourceforge.net/doc

  8. http:/ /cunit.sourceforge.net/doc/introduction.html

  9. http:/ /cunit.sourceforge.net/doc/introduction.html

  10. a test a void -> void method test methods must be part of a test suite, which must in turn be registered with registry, before it will be run

  11. Assertions (the most common ones) CU_ASSERT_TRUE(x) CU_ASSERT_FALSE(x) CU_ASSERT_EQUAL(x,y) CU_ASSERT_NOT_EQUAL(x,y) CU_ASSERT_PTR_EQUAL(x,y) CU_ASSERT_PTR_NOT_EQUAL(x,y) CU_ASSERT_PTR_NULL(x,y) CU_ASSERT_PTR_NOT_NULL(x,y) CU_ASSERT_STRING_EQUAL(x,y) CU_ASSERT_STRING_NOT_EQUAL(x,y) CU_ASSERT_DOUBLE_EQUAL(x,y, 𝜁 ) CU_ASSERT_DOUBLE_NOT_EQUAL(x,y, 𝜁 ) CU_PASS(message) CU_FAIL(message) http:/ /cunit.sourceforge.net/doc/headers/CUnit.h

  12. LIVE EXAMPLE

  13. Live coding reconstruction Production code Test code Test code is separate from production code, but calls production code to verify its functionality.

  14. Live coding reconstruction void test00(void) { int x = 5; int y = -3; int expected = 2; int actual = eval(x, y); CU_ASSERT_EQUAL( expected , actual ); } A test is a void to void function. Set up inputs and an expected (correct) answer. Compute an actual answer using production code. Compare actual and expected values.

  15. Live coding reconstruction void test01(void) { runTest(1,1,2); } void test02(void) { runTest(2,1,3); } void test03(void) { runTest(0,2,2); } void test04(void) { runTest(2,0,2); } /* Runs a test with inputs that *should* pass * and produce an expected result. */ void runTest(int x, int y, int expected) { int actual = eval(x, y); CU_ASSERT_EQUAL( expected , actual ); } Can simplify writing many tests by using a helper function, runTest.

  16. Live coding reconstruction Needed #includes: #include "CUnit.h" #include "Basic.h"

  17. Live coding reconstruction /* The main() function for setting up and running the tests. */ int main() { CU_pSuite SuiteValid = NULL; /* initialize the CUnit test registry */ if (CUE_SUCCESS != CU_initialize_registry()) { return CU_get_error(); } /* add a suite to the registry */ SuiteValid = CU_add_suite("Suite_of_tests_with_valid_inputs", NULL, NULL); if (NULL == SuiteValid) { CU_cleanup_registry(); return CU_get_error(); } /* add the tests to SuiteValid */ if ( (NULL == CU_add_test(SuiteValid, "5+(-3)=2", test00)) || (NULL == CU_add_test(SuiteValid, "1+1=2", test01)) ) { CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return CU_get_error(); }

  18. Live coding reconstruction /* The main() function for setting up and running the tests. */ int main() { CU_pSuite SuiteValid = NULL; /* initialize the CUnit test registry */ if (CUE_SUCCESS != CU_initialize_registry()) { return CU_get_error(); } /* add a suite to the registry */ SuiteValid = CU_add_suite("Suite_of_tests_with_valid_inputs", NULL, NULL); if (NULL == SuiteValid) { CU_cleanup_registry(); return CU_get_error(); } /* add the tests to SuiteValid */ if ( (NULL == CU_add_test(SuiteValid, "5+(-3)=2", test00)) || (NULL == CU_add_test(SuiteValid, "1+1=2", test01)) ) Create a test suite. In this case the suite is named SuiteValid. { CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return CU_get_error(); }

  19. Live coding reconstruction /* The main() function for setting up and running the tests. */ int main() { CU_pSuite SuiteValid = NULL; /* initialize the CUnit test registry */ if (CUE_SUCCESS != CU_initialize_registry()) { return CU_get_error(); } /* add a suite to the registry */ SuiteValid = CU_add_suite("Suite_of_tests_with_valid_inputs", NULL, NULL); if (NULL == SuiteValid) { CU_cleanup_registry(); return CU_get_error(); } /* add the tests to SuiteValid */ if ( (NULL == CU_add_test(SuiteValid, "5+(-3)=2", test00)) || (NULL == CU_add_test(SuiteValid, "1+1=2", test01)) ) { CU_cleanup_registry(); return CU_get_error(); } Register each test function with the SuiteValid test /* Run all tests using the CUnit Basic interface */ suite here. CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); If you add more test functions for this suite, add code here to register CU_cleanup_registry(); return CU_get_error(); each test function. }

  20. Live coding reconstruction /* The main() function for setting up and running the tests. */ int main() { CU_pSuite SuiteValid = NULL; /* initialize the CUnit test registry */ if (CUE_SUCCESS != CU_initialize_registry()) { return CU_get_error(); } /* add a suite to the registry */ SuiteValid = CU_add_suite("Suite_of_tests_with_valid_inputs", NULL, NULL); if (NULL == SuiteValid) { CU_cleanup_registry(); return CU_get_error(); } /* add the tests to SuiteValid */ if ( (NULL == CU_add_test(SuiteValid, "5+(-3)=2", test00)) || (NULL == CU_add_test(SuiteValid, "1+1=2", test01)) || (NULL == CU_add_test(SuiteValid, "1+2=3", test02)) || (NULL == CU_add_test(SuiteValid, "0+2=2", test03)) || (NULL == CU_add_test(SuiteValid, "2+0=2", test04)) ) { CU_cleanup_registry(); return CU_get_error(); } This is what it looks like with more test functions registered. /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); }

  21. Branching and merging in git commit commit commit master 1 2 3 HEAD A sequence of commits all in the master branch.

  22. Branching and merging in git commit commit commit master 1 2 3 HEAD bugfix Create a new branch: git branch bugfix

  23. Branching and merging in git commit commit commit master 1 2 3 HEAD bugfix Move HEAD to new branch git checkout bugfix

  24. Branching and merging in git commit commit commit master 1 2 3 HEAD commit bugfix 4 Make a commit on bugfix branch

  25. Branching and merging in git commit commit commit master 1 2 3 HEAD commit bugfix 4 commit 5 Make another commit on bugfix branch

  26. Branching and merging in git commit commit commit master 1 2 3 HEAD commit bugfix 4 commit 5 Check out master again

  27. Branching and merging in git commit commit commit master 1 2 3 HEAD commit Merge bugfix into 4 master. Since no other commits were made to commit bugfix 5 master in between this merge is straightforward.

Recommend


More recommend