我正在使用C#8.0,它支持我的项目中的开关表达式。我最近正在构建一个单元测试项目,并生成代码覆盖率报告。但是所有的开关表达式似乎都有问题。我的代码中有一些类似于以下内容的行:
private static string GenerateRequestUrl(Language language, WeatherDataType dataType) {
var url = "https://data.weather.gov.hk/weatherAPI/opendata/weather.php?";
url += language switch {
Language.English => "lang=en",
Language.TraditionalChinese => "lang=tc",
Language.SimplifiedChinese => "lang=sc",
_ => "lang=en"
};
url += dataType switch {
WeatherDataType.LocalWeatherForecast => "&dataType=flw",
WeatherDataType.NineDaysWeather => "&dataType=fnd"
};
return url;
}
我的测试方法涵盖了上面所有的情况,但是报告显示那些带有开关表达式的行没有被覆盖。就像这张图片:JetBrains Rider的报道亮点
我该怎么做才能把它们遮盖住。
虽然这可能不是您希望的答案,但代码覆盖率似乎不适用于非顺序开关表达式。
查看IL代码时,新的C#8.0开关表达式首先计算(跳转)哪个表达式为真,然后设置url
而sequential switch语句在case语句之后设置url。
因此,如果您想要全面覆盖,您应该使用sequential switch语句(如下面代码中的WeatherDataType)。
密码
IL码
.method public hidebysig static string GenerateRequestUrl(valuetype Demo.Generator/Language language,
valuetype Demo.Generator/WeatherDataType dataType) cil managed
{
// Code size 130 (0x82)
.maxstack 2
.locals init (string V_0,
string V_1,
string V_2,
valuetype Demo.Generator/WeatherDataType V_3,
valuetype Demo.Generator/WeatherDataType V_4,
string V_5)
IL_0000: nop
IL_0001: ldstr "https://data.weather.gov.hk/weatherAPI/opendata/we"
+ "ather.php\?"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: ldc.i4.1
IL_000a: brtrue.s IL_000d
IL_000c: nop
IL_000d: ldarg.0
IL_000e: switch (
IL_0021,
IL_0029,
IL_0031)
IL_001f: br.s IL_0039
IL_0021: ldstr "lang=en"
IL_0026: stloc.2
IL_0027: br.s IL_0041
IL_0029: ldstr "lang=tc"
IL_002e: stloc.2
IL_002f: br.s IL_0041
IL_0031: ldstr "lang=sc"
IL_0036: stloc.2
IL_0037: br.s IL_0041
IL_0039: ldstr "lang=en"
IL_003e: stloc.2
IL_003f: br.s IL_0041
IL_0041: ldc.i4.1
IL_0042: brtrue.s IL_0045
IL_0044: nop
IL_0045: ldloc.1
IL_0046: ldloc.2
IL_0047: call string [System.Runtime]System.String::Concat(string,
string)
IL_004c: stloc.0
IL_004d: ldarg.1
IL_004e: stloc.s V_4
IL_0050: ldloc.s V_4
IL_0052: stloc.3
IL_0053: ldloc.3
IL_0054: brfalse.s IL_005e
IL_0056: br.s IL_0058
IL_0058: ldloc.3
IL_0059: ldc.i4.1
IL_005a: beq.s IL_006c
IL_005c: br.s IL_007a
IL_005e: ldloc.0
IL_005f: ldstr "&dataType=flw"
IL_0064: call string [System.Runtime]System.String::Concat(string,
string)
IL_0069: stloc.0
IL_006a: br.s IL_007a
IL_006c: ldloc.0
IL_006d: ldstr "&dataType=fnd"
IL_0072: call string [System.Runtime]System.String::Concat(string,
string)
IL_0077: stloc.0
IL_0078: br.s IL_007a
IL_007a: ldloc.0
IL_007b: stloc.s V_5
IL_007d: br.s IL_007f
IL_007f: ldloc.s V_5
IL_0081: ret
} // end of method Generator::GenerateRequestUrl
我正在尝试用C语言实现一个测试环境,它似乎比我预期的要困难得多。似乎我有3个选择: 1) 通过接口注入依赖关系。 2)通过模板注入依赖关系 这里可以找到这些选项的一个很好的讨论:C中依赖注入的接口与模板 3) 为每个需要模拟/存根的测试生成不同的可执行文件。 选项1和2需要对源代码进行大量修改,我并不十分喜欢这些修改。我不应该为了测试而牺牲性能/清晰度。另一方面,为每个测试制定不同的项目似乎也不是
我一直试图获得本地单元测试的代码覆盖率,但没有成功。 这里有一个关于我所说的本地单元测试的参考。 https://developer.android.com/training/testing/unit-testing/local-unit-tests.html 但这似乎无济于事。我是不是漏掉了什么? 注意,如果我通过Android Studio运行本地单元测试,一切都很好。我点击了我的“测试”模块
新的一年 之前因为上家公司的经营出了问题,年前的大裁员,过了一个漫长的春节。 之后加入了新公司,然后正好赶上一个很紧急的项目,忙成狗,因此好久没更新文章了。 不过,我又回来啦! 前言 自动化测试,我们将使用karma和nightmare,内容会包括: 单元测试 e2e测试(放下一篇文章) 其实,单元测试一般用在写公共包的时候,比如通用的js函数库,通用的UI组件库。基本不太会在做业务项目的时候还使
我的问题是什么?我试图使用WinDBG附加到我的一些单元测试,这些测试在类库(单元测试项目)中,但是我不能让WinDbg打破托管异常。 我为什么要这样做?目前,我有一些使用垫片的测试,并且遇到了这个问题:UnitTestIsolation异常:在发布/调试模式下运行垫片测试时抛出异常 然而,只有当这些测试与其他一些不使用垫片的测试同时运行(在测试资源管理器中的播放列表相同)时,才会发生这种情况。单
是否有人能够从Maven Build获得JaCoCo中JMockit和Powermock单元测试的复盖范围? 我有一个Powermock单元测试的现有测试集,我希望逐步将其迁移到JMockit。但是我需要能够在一个报告中看到所有单元测试的测试覆盖范围,最好是在Sonar中。 通过将JaCoCo置于“脱机”模式,我确实使JMockit和Powermock测试与Surefire/JaCoCo一起运行(
我可以在声纳获得单位测试覆盖率通过使用Jacoco工具的代码覆盖率,并使用其报告在声纳属性文件为'sonar.jacoco.report路径=.../Reports/report.exec'。如何通过使用RAD的默认插件获得SONAR中的单元测试覆盖率,该插件以. coveragedata、. Analysis和. html格式生成报告?