Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Mayank Kumar
Mayank Kumar

Posted on

Increasing Code Coverage in faker-cxx

For the Release 0.3 milestone of my OSD600 course, I returned to contribute to thefaker-cxx library, a C++ library designed for generating realistic fake data. As someone who had previously contributed to this project, I was eager to take on a more challenging issue. This time, I focused on increasing code coverage for a specific module.

The Issue

The functionISBN10 generates a 10-digit ISBN, sometimes with the letter "X" as the last character (representing a check digit of 10). The challenge is in the fact that this occurrence is random and relatively rare.

std::stringISBN10(){constautoisbn10=string::numeric(9,true);intsum=0,weight=10;for(size_ti=0;i<9;i++){sum+=(isbn10[i]-'0')*weight;weight--;}intcheckDigit=sum%11;if(checkDigit!=0){checkDigit=11-checkDigit;}if(checkDigit==10){returnisbn10+"X";}returnisbn10+std::to_string(checkDigit);}
Enter fullscreen modeExit fullscreen mode

While the function works well, the existing test covered it minimally, running it once to check the result. The random nature meant edge case of generating an ISBN ending in "X" was often missed.

My Approach

Before diving into the code, I spent time understanding how ISBN generation and validation worked. The check digit calculation involves a weighted sum of the first nine digits, which must be divisible by 11. If the remainder is 10, the check digit becomes "X". This process provided the basis for writing effective tests.

The original test checked for validity but did not focus on the edge case of "X". I modified it to ensure it only handled ISBNs without "X". To address the edge case, I introduced a new test. Given the randomness, generating "X" reliably required multiple iterations which I achieved by adding a loop to maximize the chance of generating "X". As a fallback, if "X" was not generated, I used a pre-defined valid ISBN ending with "X".

GitHub logo feat: improve codecov for commerce module#986

This closes #907

This PR improves the test coverage for theISBN10 function incommerce.cpp and the associatedcommerce_test.cpp file.

Changes:

  1. UpdatedshouldGenerateIsbn10 : Updated to check only ISBNs without X.
  2. AddedshouldGenerateIsbn10WithX : Specifically tests for the check digit - X.
      std::string generatedIsbn10;bool foundXCase =false;for (size_t i =0; i <100 && !foundXCase; i++)  {      generatedIsbn10 =ISBN10();if (generatedIsbn10[9] =='X')      {          foundXCase =true;      }  }if (!foundXCase)  {      generatedIsbn10 ="094339600X";  }
    Enter fullscreen modeExit fullscreen mode

Improved Test Coverage

  • commerce.cpp from 98% to 100%.
  • commerce_test.cpp from 96% to 99%.

Note: While the tests achieve 99% coverage forcommerce_test.cpp, the if(!foundXCase) branch inshouldGenerateIsbn10WithX is intentionally left uncovered to maintain logical clarity and introduce fallback.

Challenges and Learnings

  • Reviewing coverage reports withgcov andlcov was instrumental in identifying the uncovered cases.
  • Writing tests for functions with randomness requires strategic thinking.
  • Breaking tests into specific cases (e.g., with and without "X") helps ensure coverage while maintaining readability.

After my changes, the tests covered all possible outputs of theISBN10 function, increasing overall module coverage. Although one fallback line remained technically uncovered, thorough testing and the inherent randomness of the function were finely balanced.

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Computer Programming Student at Seneca College, Toronto
  • Joined

More fromMayank Kumar

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp