- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Jacoco进行单元测试代码覆盖率。 Jacoco 生成的报告显示,我的 Kotlin 代码 中遗漏了很少的分支。我注意到根据 Jacoco 的说法,协程代码及其后面的代码没有被正确覆盖。我不确定是因为协程还是其他什么原因。使用 IntelliJ 代码覆盖率运行单元测试时,我的 Kotlin 类显示100% 覆盖率。
我不知道为什么 Jacoco 的报道较少。我已经使用 Spock (Groovy) 编写了单元测试。
请引用以下图片:
最佳答案
类似于“Why is JaCoCo not covering my String switch statements?”:
JaCoCo 执行字节码分析,而不是源代码。使用 kotlinc 1.3.10
Example.kt
package example
fun main(args: Array<String>) {
kotlinx.coroutines.runBlocking { // line 4
}
}
生成两个文件 ExampleKt.class
和 ExampleKt$main$1.class
,最后一个文件的字节码 (javap -v -p ExampleKt$main$1.class) class
) 包含方法 invokeSuspend(Object)
public final java.lang.Object invokeSuspend(java.lang.Object);
descriptor: (Ljava/lang/Object;)Ljava/lang/Object;
flags: ACC_PUBLIC, ACC_FINAL
Code:
stack=3, locals=4, args_size=2
0: invokestatic #29 // Method kotlin/coroutines/intrinsics/IntrinsicsKt.getCOROUTINE_SUSPENDED:()Ljava/lang/Object;
3: astore_3
4: aload_0
5: getfield #33 // Field label:I
8: tableswitch { // 0 to 0
0: 28
default: 53
}
28: aload_1
29: dup
30: instanceof #35 // class kotlin/Result$Failure
33: ifeq 43
36: checkcast #35 // class kotlin/Result$Failure
39: getfield #39 // Field kotlin/Result$Failure.exception:Ljava/lang/Throwable;
42: athrow
43: pop
44: aload_0
45: getfield #41 // Field p$:Lkotlinx/coroutines/CoroutineScope;
48: astore_2
49: getstatic #47 // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
52: areturn
53: new #49 // class java/lang/IllegalStateException
56: dup
57: ldc #51 // String call to 'resume' before 'invoke' with coroutine
59: invokespecial #55 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
62: athrow
LineNumberTable:
line 4: 3
line 5: 49
它与源文件的第 4 行关联并包含分支(ifeq
、tableswitch
)。
虽然目前最新的 JaCoCo 版本 (0.8.2) 具有针对各种编译器生成的工件的过滤器,例如 switch
语句中的 String
、Kotlin 编译器生成的字节码协程没有被过滤。变更日志可以在https://www.jacoco.org/jacoco/trunk/doc/changes.html查看以及其他:https://www.jacoco.org/research/index.html还有presentation about bytecode pattern matching显示/解释了许多编译器生成的工件。
您在 IntelliJ IDEA 中看到的 100% - 只是行覆盖率,因此您正在尝试比较两个完全不同的事物。作为证明 - 这是 IntelliJ IDEA 的屏幕截图,它显示 100% 的行覆盖率,但仅执行了 if
的一个分支(其中 args.size >= 0
计算结果为 true
)
这是执行同一源文件时 JaCoCo 报告的相应屏幕截图
进入包级别,您可以看到 100% 的线路覆盖率,但 50% 的分支覆盖率
然后通过第一个链接进入类级别 ExampleKt.main.new Function2() {...}
您可以再次看到该方法 invokeSuspend(Object)
贡献错过的分支
JaCoCo version 0.8.3具有 Kotlin 编译器添加的用于挂起 lambda 和函数的分支过滤器:
关于kotlin - Kotlin 协程的 Jacoco 代码覆盖率不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53485360/
我正在查看Kotlin Github page我注意到 Kotlin 语言本身大部分是用 Kotlin 编写的:我只是想知道,一种语言怎么可能大部分都是用它自己的语言编写的?在您可以使用正在创建的语言
我有以下非常简单的 kotlin 代码来演示中缀函数 com.lopushen.demo.presentation 包 fun main(args: Array) { print("Hello
我在 Java 中有 2 个模型类,其中一个扩展了另一个 @UseStag public class GenericMessages extends NavigationLocalizationMap
Kotlin 代码 runBlocking { flow { for (i in 0..4) { println("Emit $i")
这三个 Kotlin 插件和它们的实际作用有什么区别? plugins { id 'kotlin-android' id 'org.jetbrains.kotlin.android'
我正在为某些现有库添加 Kotlin 原生 linuxX64 目标支持。库已成功编译,但在运行测试用例时,出现以下运行时错误: kotlin.native.concurrent.InvalidMuta
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
我创建了一个类并向其添加了一个与成员函数具有相同签名的扩展,并执行了这个方法,它总是执行成员方法。 class Worker { fun work() = "...working" } fun
我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说一直是个问题。在下面的示例代码中,我想通过使用函数“changeNum”修改变量“num”的值。但当然,Kotlin
现在,我正在尝试用 Kotlin 重写我的 Java 应用程序。然后,我遇到了日志语句,比如 log.info("do the print thing for {}", arg); 所以我有两种方法可
有点出名article关于许多语言的异步编程模型的状态,指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步。以下是这种语言的属性: 每个函数都有一种颜色,红色或蓝色(例如asy
因为 KDoc 文档生成引擎是 abandoned in favor of Dokka , Kotlin 文档应该称为“KDoc 注释”,还是“Dokka 注释”? 最佳答案 如所述here , KD
我想在可空对象上传递函数引用。以 Android 为例,假设我想使用 Activity#onBackPressed来自作为该事件的子级的片段。 如果我想调用这个函数,我可以很容易地做到 activit
我有一个列表 (x, y)其中y只能是 0 或 1 这样 例如: [(3, 0), (3, 1), (5, 1)] [(5, 0), (3, 1), (5, 1)] [(1, 1), (3, 1),
从强类型语言的定义来看: A strongly-typed programming language is one in which each type of data (such as intege
这不能编译的事实是否意味着它们不是一流的类型? fun foo(s: String): Int = s.length // This won't compile. val bar = foo 有没有办
如果在 Java i++是一个表达式和 i++;是一个表达式语句,分号(;) 在 Kotlin 中是可选的,是 i++ Kotlin 中的表达式或表达式语句? 最佳答案 i++是一个表达式,因为它有一
代码(如下所示)是否正确?它取自 Kotlin-docs.pdf 的第 63 页,这也是 https://kotlinlang.org/docs/reference/generics.html 的最后
我正在尝试使用 Kotlin 为 Android 的一些全局 API 解析器(检查网络连接、调用 API 并通过来自源的单个调用返回格式化数据),并且在某些时候我不得不创建一个通用类型 object就
kotlinlang 中的任务: 使用月份变量重写此模式,使其与格式 13 JUN 1992(两位数字、一个空格、一个月份缩写、一个空格、四位数字)中的日期相匹配。 答案是:val month = "
我是一名优秀的程序员,十分优秀!