gpt4 book ai didi

c++ - 带优化的代码覆盖率

转载 作者:太空狗 更新时间:2023-10-29 20:55:06 26 4
gpt4 key购买 nike

目前我有一堆针对我的 C++ 项目的单元测试,但我(还)没有测试代码覆盖率。我正在使用 -O3 优化标志编译测试以暴露潜在的细微错误,但似乎如果我想使用 gcov 之类的工具收集覆盖率信息,任何优化标志都必须是禁用。我应该构建测试两次(一次使用 -O3,另一次不使用)吗?通常如何处理这个问题?

最佳答案

通常要执行多种测试来确保软件的质量,以及编译器选项的不同标准。

通常,构建系统会提供两种或多种构建选择,例如:

调试:-O0(无优化)带断言

发布:没有断言的“更高优化”(-O2、-Os 或 -O3 取决于什么对您的项目“最好”)。这通常是您向客户交付代码的模式。

有时会有“Release+Asserts”,这样您仍然可以在运行时检查代码的正确性,并具有一定的性能。

以下是我认为测试可以分为的一些类别:

  1. 功能正确性(又名“正面测试”)。这是您检查“代码在正常情况下正常工作”的地方。运行调试和发布。

  2. 阴性测试。检查错误条件是否正常工作 - 传递应该给出错误的垃圾值(“不存在的文件”应该给出 E_NO_SUCH_FILE)。通常同时进行调试和发布。

  3. 压力测试 - 运行苛刻的测试,检查软件在长时间运行时是否正常运行,有很多线程等。通常是 Debug模式 - 可能两者兼而有之。

  4. 报道。运行一组测试以确保您“覆盖所有路径”(通常带有一定程度的“未覆盖”,例如您应该覆盖 95% 的功能和 85% 的分支——因为某些条件可能极难实现无需手动检测代码 - 仅当磁盘已满或操作系统无法创建新进程时才会出现错误)。通常编译为 Debug。

  5. 容错测试。 “负面测试”的一种形式,您可以在其中为内存分配和类似功能插入“模拟”功能,模拟顺序或随机的故障,以发现未检测到错误且代码失败的后续结果的情况较早的错误,而不是在正确的位置产生正确的错误。同样,通常使用 Debug 运行 - 但也可能值得在 Release 中运行。

  6. 性能测试。衡量程序性能的地方 - 每秒生成的帧数、编译器中的每秒行数或文件下载系统中的每小时千兆字节数等。这应该按照发行版进行编译,因为“未优化”代码中的运行性能是几乎总是毫无意义。

对于复杂的软件产品,您常常不得不在“运行一切”和“所花费的时间”之间进行折衷——例如,在调试和 Release模式下运行所有​​ 4000 个功能测试可能需要 12 小时,仅运行 Debug模式需要花费7小时,太可取了。这种妥协是通常的“工程决策”——“在理想世界中,你会这样做,但在现实世界中,我们必须妥协,这就是为什么我认为这种测试配置是正确的”。

例如,许多测试系统对源代码的每次更改都运行轻度测试 [在工程师他/她自己说“我认为这可行”之后],每晚进行更重的测试,并在周末进行更多测试。这允许在运行所有测试所需的时间和一名工程师进行小更改所需的时间之间做出折衷。

关于c++ - 带优化的代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36930207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com