跟踪通过和失败的测试数量,并在运行所有测试的 for 循环结束时显示摘要

516 阅读3分钟

跟踪通过和失败的测试数量,并在运行所有测试的 for 循环结束时显示摘要

摘要可以从将运行的测试数开始。我考虑过为每个测试添加一个运行计数,但决定不这样做,因为测试现在没有特定的顺序运行。我并不是说每次运行测试应用程序时它们都会以不同的顺序运行,但如果代码被更改并重建项目,它们可以重新排序。这是因为在创建链接器将在多个 .CPP 编译单元。当然,我们需要跨多个文件进行测试才能看到重新排序,现在,所有测试都在 Creation.cpp 中。

关键是测试根据全局实例的初始化方式进行自我注册。在单个.cpp源文件中,有一个定义的顺序,但没有保证多个文件之间的顺序。因此,我决定不在每个测试结果旁边加上一个数字。

我们将跟踪通过和失败的测试数量,并在运行所有测试的 for 循环结束时显示摘要。

作为另一个好处,我们还可以更改 runTests 函数以返回失败的测试数。这将允许 ma in 函数也返回失败的 couint,以便脚本可以测试此值以查看测试是否通过或有多少失败。应用程序退出代码为零将意味着没有任何失败。除零以外的任何值都将表示运行失败,并将指示失败的测试数。

这是对 ma in 的简单更改。cpp 返回失败计数:

int main () {

return MereTDD::runTests(); 

}

然后,这是包含摘要更改的新 runTests 函数。这些更改分为三个部分。所有这些都是一个单一的功能。只有描述分为三个部分。第一部分仅显示将运行多少个测试的计数:

inline int runTests () {

    std::cout <<"Running" 

        << getTests().size() 

        <<"tests\n";

在第二部分中,我们需要跟踪有多少测试通过,有多少测试失败,如下所示:

int numPassed = 0;

int numFailed = 0;

for (auto * test: getTests()) 

{

		std::cout <<"-------------\n" 
		
			<< test->name()
	
			<< std::endl; 
			
		try

		{

			test->run(); }

		catch(...) {

				test->setFailed("Unexpected exception thrown."); }

		if (test->passed()) }

			++numPassed; 
			
			std::cout <<"Passed"

				<< std::endl; {

		else {

			++numFailed;

			std::cout << "Failed\n" 
			
				<< test->reason()

				<< std::endl; 
		}
	}

在第三部分中,在循环遍历所有测试并计算通过和失败的测试数量之后,我们显示一个包含计数的摘要,如下所示:

std::cout << "---------------\n"; 

if (numFailed == 0)

{

	std::cout << "All tests passed." 
	
		<< std::endl;

}

else 

{

	std::cout << "Tests passed: "<< numPassed 
	
		<<"\nTests failed:"<< numFailed 
		
		<< std::endl;

	}

	return numFailed; 
}

现在运行项目会显示初始计数、单个测试结果和最终摘要,您还可以看到由于测试失败而导致应用程序退出代码为 1:

image.png

image.png

显示退出代码的最后一行实际上不是测试应用程序的一部分。运行应用程序时通常不会显示此信息。这是我用来编写此代码的开发环境的一部分。如果您从脚本(如 Python)运行测试应用程序作为自动生成脚本的一部分,您通常会对退出代码感兴趣。


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情