优化的代码覆盖率 目前我有一个单元测试用于我的C++项目,但是我还没有测试代码覆盖率。我正在使用-O3优化标志编译测试,以暴露潜在的细微缺陷,但如果我想使用gcov之类的工具收集覆盖率信息,则必须禁用任何优化标志。我是否应该构建两次测试(一个有-O3,另一个没有)?这个问题通常是如何处理的?
为了确保软件的质量,通常要执行多种测试,对于哪些编译器选项有不同的标准 通常,生成系统提供两个或多个生成选项,例如: 调试:-O0(无优化)和断言 发布:“更高的优化”(-O2、-Os或-O3,取决于对项目“最佳”的内容),无需断言。这通常是您向客户交付代码的模式 有时会有“Release+Asserts”,这样您仍然可以在运行代码时检查代码的正确性,同时表现出一定的性能 我认为测试可以分为以下几类:优化的代码覆盖率 目前我有一个单元测试用于我的C++项目,但是我还没有测试代码覆盖率。我正在使用-O3优化标志编译测试,以暴露潜在的细微缺陷,但如果我想使用gcov之类的工具收集覆盖率信息,则必须禁用任何优化标志。我是否应该构建两次测试(一个有-O3,另一个没有)?这个问题通常是如何处理的?,c++,unit-testing,code-coverage,C++,Unit Testing,Code Coverage,为了确保软件的质量,通常要执行多种测试,对于哪些编译器选项有不同的标准 通常,生成系统提供两个或多个生成选项,例如: 调试:-O0(无优化)和断言 发布:“更高的优化”(-O2、-Os或-O3,取决于对项目“最佳”的内容),无需断言。这通常是您向客户交付代码的模式 有时会有“Release+Asserts”,这样您仍然可以在运行代码时检查代码的正确性,同时表现出一定的性能 我认为测试可以分为以下几类: 功能正确性(也称为“阳性测试”)。这是您检查“代码在正常情况下正常工作”的地方。运行调试和发布
例如,许多测试系统对源代码的每一次更改(在工程师自己“我认为这是可行的”之后)都进行轻测试,每晚进行重测试,周末进行更多测试。这允许在运行所有测试所需的时间和一名工程师进行小改动所需的时间之间达成折衷。
这个问题通常如何处理?
我正在使用-O0
编译测试。使用Valgrind(或gcc的一些sanitize
标志)等探查器更适合查找潜在的bug<代码>-O3适用于性能基准测试。@GLUTTON是的,我正在使用Valgrind运行测试。-O0
是否与无优化标志相同?因为它是默认选项。是否-O0与无优化标志相同?
是的。正如您在第4节中所说,-O0
应用于覆盖率测试。是吗?是的,经常是这样,但不总是这样。特别是如果您有调用函数检查内容的#if DEBUG
,关闭DEBUG将给出不同的覆盖结果。另一方面,取决于覆盖工具的性能[它与编译器的交互程度],它可能无法“看到”来自内联函数的覆盖,因此完全优化的覆盖也可能无法很好地工作。这其中的一部分取决于您正试图使用覆盖率工具实现什么—测试代码的生产版本,或者检查测试是否覆盖所有分支,等等。。。