- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 dotCover 来分析我的单元测试的代码覆盖率,我得到了一些奇怪的结果......我有一个覆盖率不完整的迭代器方法,但未覆盖的语句只是方法末尾的右大括号。
这是我正在测试的方法:
public static IEnumerable<T> CommonPrefix<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
source.CheckArgumentNull("source");
other.CheckArgumentNull("other");
return source.CommonPrefixImpl(other, comparer);
}
private static IEnumerable<T> CommonPrefixImpl<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
comparer = comparer ?? EqualityComparer<T>.Default;
using (IEnumerator<T> en1 = source.GetEnumerator(),
en2 = other.GetEnumerator())
{
while (en1.MoveNext() && en2.MoveNext())
{
if (comparer.Equals(en1.Current, en2.Current))
yield return en1.Current;
else
yield break;
}
} // not covered
} // not covered
单元测试:
[Test]
public void Test_CommonPrefix_SpecificComparer()
{
var first = new[] { "Foo", "Bar", "Baz", "Titi", "Tata", "Toto" };
var second = new[] { "FOO", "bAR", "baz", "tata", "Toto" };
var expected = new[] { "Foo", "Bar", "Baz" };
var actual = first.CommonPrefix(second, StringComparer.CurrentCultureIgnoreCase);
Assert.That(actual, Is.EquivalentTo(expected));
}
以及覆盖结果:
我假设 using
block 的右大括号实际上是对枚举器上的 Dispose
的调用;但是,为什么不执行呢?我首先怀疑 NUnit 没有处理枚举器,但如果我在 actual
上执行 foreach,我会得到相同的结果。
至于第二个未覆盖的右大括号,我不知道它代表什么......我猜它与编译器如何转换迭代器 block 有关。
谁能阐明这两个“语句”是什么,以及为什么它们没有被执行?
编辑:Peter 提出了一个很好的问题:上面显示的结果是在调试构建 上运行测试时获得的。如果我在发布版本 上运行测试,CommonPrefixImpl
方法的覆盖率为 100%,因此它可能与编译器优化有关。
最佳答案
迭代器方法的一个问题是编译器会生成一个相当大且复杂的状态机来管理迭代器方法中代码的延迟执行。这通常会生成一两个类。这些类旨在处理一般情况而不是您的特定情况,因此其中可能至少有一些代码从未使用过。您可以通过使用 ILSpy、JustDecompile 或 Reflector 等工具查看程序集来查看生成的内容。它将显示 C# 编译器生成的程序集中的类(通常类名包含“<”等)
探查器知道的是 PDB 如何与您的代码相关联,尽管有可能 您编写的所有代码 都可能被执行,但仍有可能并非所有由生成的代码编译器被执行了。探查器可能不知道这一点,只是说执行了特定百分比(小于 100)的特定迭代器方法。
可能生成的内容之一是异常处理代码。因为编译器不知道您的代码不会或可能不会生成异常,所以它仍会生成代码来补偿异常——它需要防止其状态被破坏。我敢打赌,如果你在迭代器方法的不同地方包含了一种方法,可以根据某个标志抛出异常,并运行该方法两次(一次没有异常,一次在同一次运行中有异常),那么百分比会不同——可能更高因为随后将执行生成的异常处理代码。
方法的结尾“似乎”没有被执行的事实可能是因为该代码是状态机中被执行的不同方法的一部分,并且编译器从不生成从生成的代码到代码的关联在你的类里面。
更新:要更好地了解编译器正在做什么并查看它生成的代码类型的示例,请参阅 C# 规范中的 10.14 迭代器部分( http://www.microsoft.com/en-us/download/details.aspx?id=7029 )
关于c# - 迭代器 block 的奇怪测试覆盖率结果,为什么不执行这些语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11918858/
在旧版 Web 应用程序中,我们没有对 javascript 部分进行任何单元测试。 我们希望提高代码质量并删除死代码。 有什么方法可以在人工测试期间在浏览器中进行逐行 Javascript 代码覆盖
我已经为我的 python 代码编写了测试,并且想检查测试覆盖了多少百分比,所以我决定使用 python 覆盖。但是我启动它时遇到问题。我用这个 bash 命令启动我的测试: export PYTHO
我正在使用 python 覆盖工具来运行我的单元测试。从结果中可以看出,它包括所有“站点包”。我怎样才能将它们排除在报告之外?我只想显示项目源代码的报告。 (ctrp) ubuntu@ubuntu-x
我正在尝试使用 Opencover 来运行 NUnit 测试用例的代码覆盖率。我得到了预期的结果,但问题是在执行 opencover 时它再次运行测试。我们不希望发生这种情况,因为我们单独运行测试。下
我正在尝试使用 Opencover 来运行 NUnit 测试用例的代码覆盖率。我得到了预期的结果,但问题是在执行 opencover 时它再次运行测试。我们不希望发生这种情况,因为我们单独运行测试。下
我有一个 python 项目,我使用: pipenv 毒性 pytest 还有更多。 基本上,我想将 tox 添加到我的 gitlab 管道中。几乎一切似乎都有效,从 tox 调用 mypy、flak
我使用Coverity来分析代码C。 配置命令: cov-configure --compiler /opt/toolchains/stbgcc-4.5.4-2.9/bin/mipsel-linux-
是否可以在运行时测量 python 代码覆盖率并在生成结果时查看结果?我尝试使用 coverage但找不到有帮助的选项。我最初的实验表明,.coverage 文件直到程序执行结束才被保存,这意味着我们
我有一个文件,test_basic.py: class TestCalculator(): def test_calculator(self): from basic impo
我有一个小型 PHP 项目,它使用 PHPUnit 进行单元测试和覆盖。我想生成 cobertura XML 格式的覆盖率报告。 我可以使用任何工具或插件来实现这一目标吗? 感谢任何帮助.. 最佳答案
我正在研究一个小 gem 并包含 simplecov到 spec_helper.rb 两行: require 'simplecov' SimpleCov.start 当我运行 rspec 测试时,si
go -cover 或 -coverprofile 在运行 go 测试时非常有用,并且可以在 html 或纯文本中很好地显示。但是是否有 api 以编程方式访问它或处理文件? 最佳答案 你可以试试ax
当我遇到代码覆盖问题时,我目前开始在 PHPUnit 中使用 strict 模式: 如果我使用setUp-方法创建我的类的新实例,__constructor-方法在我运行测试。 这是我的测试设置: p
我正在运行 EclEmma,它是 Eclipse 的 Emma 插件,覆盖率报告仅显示我定义的 Enum 的部分覆盖率,即使它显示 Enum 中唯一的值被覆盖。我假设支持 Enum 的隐含方法存在覆盖
我正在将 ANT 构建转换为 Maven。我不使用声纳。 在 Maven 中,Jacoco 似乎没有报告有关单元测试本身的覆盖率,而 ANT 则报告了。我也一直在尝试为我的 Maven 构建获取这个,
我正在努力为我正在处理的库实现 100% 的代码覆盖率,但我似乎对 switch 语句和覆盖率有一些问题,我根本不明白。 我目前使用的是 Jacoco 0.7.2,因为每个新版本似乎都与 Robole
有没有在intelliJ中不用浏览器运行代码覆盖率的方法? http://www.jetbrains.com/webstorm/webhelp/monitoring-code-coverage-for
我想确保我的 Django 测试套件涵盖我的 URL 配置中列出的所有 URL。有没有办法将 URL 配置中的列表与测试套件中命中的 URL 列表进行比较? 最佳答案 我能够通过定义自定义测试套件运行
哇,好乱啊。这是场景。 主干驱动的 JS 应用。 用于 AMD 功能的 RequireJS,初始化如下: 然后在 main.js 中添加以下配置代码: require.config( { p
我的问题很简单,但答案仍然难以捉摸。假设我有一个包裹 package mypackage func DoTheThing() int { return 5 } 现在假设我在 mypackage_t
我是一名优秀的程序员,十分优秀!