本文主要是介绍北京理工大学2019软件工程个人项目-数独-06,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本开发周期编写了主函数main.cpp,并对SudokuGenerator类和SudokuSolver类进行了测试
0. GitHub项目地址
本项目对应的GitHub代码仓库点此进入
4. 软件实现
4.4 实现main.cpp
main.cpp 文件实现了类图设计中User
的功能。它接受命令行传来的参数,在进行参数正确性检验后,调用SudokuGenerator和SudokuSolver类的实例求解指定任务。
main.cpp 的实现已经签入github。
5. 代码测试
为验证软件产品的正确性,针对所有用户调用的类——即SudokuGenerator和SudokuSolver类进行测试。
5.1 测试SudokuGenerator类
使用Visual Studio 2019新建本地测试项目,在其中对SudokuGenerator类进行测试。
5.1.1 用例设计
SudokuGenerator的公有函数仅有构造函数和GenerateSudoku,因此测试这个函数即可。
该函数的行为仅受SudokuGenerator构造函数创建的文件指针和生成数独数量影响,而文件指针在主次运行中固定,因此可以将输入文件名固定,测试用例间的不同仅有
输出值。
测试用例应当包含各种可能的值:合法的和不合法的,同时应当覆盖各种数量级。据此,设计测试用例如下
Id | 输入 | 输出 |
---|---|---|
1 | SudokuGenerator("./Sudoku.txt", “-10”).GenerateSudoku | 抛出异常 |
2 | SudokuGenerator("./Sudoku.txt", “-1”).GenerateSudoku | 抛出异常 |
3 | SudokuGenerator("./Sudoku.txt", “0”).GenerateSudoku | 抛出异常 |
4 | SudokuGenerator("./Sudoku.txt", “1”).GenerateSudoku | 一组合法数独 |
5 | SudokuGenerator("./Sudoku.txt", “10”).GenerateSudoku | 10组合法数独 |
6 | SudokuGenerator("./Sudoku.txt", “100”).GenerateSudoku | 100组合法数独 |
7 | SudokuGenerator("./Sudoku.txt", “1000”).GenerateSudoku | 1000组合法数独 |
8 | SudokuGenerator("./Sudoku.txt", “10000”).GenerateSudoku | 10000组合法数独 |
9 | SudokuGenerator("./Sudoku.txt", “100000”).GenerateSudoku | 100000组合法数独 |
10 | SudokuGenerator("./Sudoku.txt", “1000000”).GenerateSudoku | 1000000组合法数独 |
对应的测试方法如下。
TEST_METHOD(testGenerateSudoku){std::string outFile = "./Sudoku.txt";std::string num[10] = { "-10","-1", "0", "1", "10", "100","1000","10000", "100000", "1000000" };for (int i = 0; i < 10; i++){try{SudokuGenerator g(outFile.c_str(), num[i]);g.GenerateSudoku();}catch(std::invalid_argument e){if (i >= 3)Assert::Fail();}catch(std::exception e){Assert::Fail();}Assert::IsTrue(this->SudokuLegal(outFile));}
测试结果如图:
为了验证测试的有效性,我们还进行了代码覆盖率检测,检测结果如下。
测试的覆盖率达82.69%,说明我们实际的测试用例是有效合理的。
5.2 测试SudokuSolver类
与SudokuGenerator类同理,我们调用的这个类的公有函数仅有构造函数和SolveSudoku. 该函数的行为受输入文件和输出文件的影响。由于输出文件是固定的,我们仅需改变输入文件即可。据此,设计测试用例如下。
Id | 输入 | 输出 |
---|---|---|
1 | SudokuGenerator("", “./Sudoku.txt”).GenerateSudoku | 抛出异常 |
2 | SudokuGenerator("./", “./Sudoku.txt”).GenerateSudoku | 抛出异常 |
3 | SudokuGenerator(“emptyFile.txt”, “./Sudoku.txt”).GenerateSudoku | 抛出异常 |
4 | SudokuGenerator("./Sudoku1.txt", “./Sudoku.txt”).GenerateSudoku | 一个数独的解 |
5 | SudokuGenerator("./Sudoku10.txt").GenerateSudoku | 10个数独的解 |
6 | SudokuGenerator("./Sudoku100.txt").GenerateSudoku | 100个数独的解 |
7 | SudokuGenerator("./Sudoku1000.txt").GenerateSudoku | 1000个数独的解 |
8 | SudokuGenerator("./Sudoku10000.txt").GenerateSudoku | 10000个数独的解 |
9 | SudokuGenerator("./Sudoku100000.txt").GenerateSudoku | 100000个数独的解 |
10 | SudokuGenerator("./Sudoku1000000.txt").GenerateSudoku | 1000000个数独的解 |
其中,emptyFile.txt为一个空文件,"./Sudoku*.txt"为包含*个数独题目的文件。
对应的测试方法如下。
TEST_METHOD(testSolveSudoku){std::string inFile = "./Sudoku.txt";std::string outFile[10] = {"", ".", "emptyFile","./Sudoku1.txt", "./Sudoku10.txt","./Sudoku100.txt","./Sudoku1000.txt","./Sudoku10000.txt","./Sudoku100000.txt", "./Sudoku1000000.txt"};for(int times = 0; times < 4; times++)for (int i = 0; i < 10; i++){try {SudokuSolver g(inFile.c_str(), outFile[i]);g.SolveSudoku();}catch (std::invalid_argument e){if (i >= 3)Assert::Fail();}catch (std::exception e){Assert::Fail();}Assert::IsTrue(this->SolutionLegal(inFile, outFile[i]));}}
运行上述测试,结果如下图。
为了验证测试的有效性,我们还进行了代码覆盖率检测,检测结果如下。
测试的覆盖率达86.54%,说明我们实际的测试用例是有效合理的。
这篇关于北京理工大学2019软件工程个人项目-数独-06的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!