Next: , Previous: LTO Testing, Up: Testsuites


7.7 对gcov测试的支持

提供了对测试gcov和检查分支profile是否产生预期值的语言无关的支持。 gcov测试还依赖于gcc.dg.exp的程序,来编译和运行测试程序。 一个典型的gcov测试包含下列在注释中的DejaGnu命令:

     { dg-options "-fprofile-arcs -ftest-coverage" }
     { dg-do run { target native } }
     { dg-final { run-gcov sourcefile } }

gcov输出的检测可以包括行数,分支百分比和调用返回百分比。 所有这些检测都由在测试源文件中注释里出现的命令来请求。 缺省情况下处理检测行数的命令。检测分支百分比和调用返回百分比的命令, 当run-gcov命令具有相应的参数branchescalls时, 才会被处理。例如,下面指定了两者都检测, 同时还传给gcov一个-b

     { dg-final { run-gcov branches calls { -b sourcefile } } }

行数命令出现在注释中,其源行期望能获得指定的数, 并具有形式count(cnt)。 测试应该只检测对于任意体系结构都会得到同一数值的行数。

检测分支百分比(branch)和调用返回百分比(returns)的命令彼此很 相似。起始命令出现在将报告百分比的一个行范围的第一行或者之前, 结束命令跟在行范围之后。起始命令可以包括一个百分比列表,其为在范围内期望获得的。 范围由同种类型的下一个命令来终止。 命令branch(end)returns(end)标记了范围的结束, 而不起是一个新的。例如:

     if (i > 10 && j > i && j < 20)  /* branch(27 50 75) */
                                     /* branch(end) */
       foo (i, j);

对于调用返回百分比,指定的值为调用报告返回的百分比。对于分支百分比, 值或者为期望的百分比,或者为100减去那个值, 因为分支的方向可以根据目标机或优化级别而不同。

并不是所有的分支和调用都需要被检测。 测试不应检测可能被优化掉的或者被断言指令替代的分支。 不要检测编译器插入的调用或者可能被inline或优化掉的。

单个测试可以检测行数,分支百分比和调用返回百分比的组合。 检测行数的命令必须出现在将会报告行数的行中, 但是检测分支百分比和调用返回百分比的命令,可以将报告的行括起来。