Nicht abdeckbarer Code
(blog.npcode.com)Schon bei einem so einfachen Kotlin-Code ist es nahezu unmöglich, alle Verzweigungen zu testen. Der Grund ist, dass Kotlin diesen Code beim Kompilieren in Bytecode in Verzweigungen umwandelt, die vom Autor des Codes nicht beabsichtigt waren.
when(answer) {
"yes" -> true
else -> false
}
Einerseits bietet Kotlin den Entwicklern, die den Code schreiben, viele praktische Funktionen, andererseits erzeugt es beim Kompilieren in Bytecode auch viele solche Verzweigungen, die für den Nutzer nicht sichtbar sind. jacoco, das am weitesten verbreitete Test-Coverage-Tool auf der JVM-Plattform, berechnet die Branch-Coverage auf Basis des Bytecodes. Deshalb kann es verlangen, auch Verzweigungen abzudecken, die Entwickler bei der Verwendung der Sprache Kotlin nicht bemerken. Wenn Kotlin-Entwickler also versuchen, 100 % Test-Coverage zu erreichen, kann es in Fällen wie dem obigen nötig sein, den Code zu dekompilieren. Mit noch mehr Pech scheitert sogar die Dekompilierung, sodass man den Bytecode direkt betrachten muss, um festzustellen, welche Verzweigungen vorhanden sind.
9 Kommentare
https://toss.im/slash-21/sessions/1-6
Es wirkt irgendwie wie eine Verkehrung von Mittel und Zweck, den Code zu verbiegen, nur um 100 % Coverage-Tracking zu erreichen.
Der Code ist nicht verbogen. Es gibt nur andere Wege, die aus menschlicher Sicht bequemer sind.
Im Bereich Verteidigung (Waffensysteme) verlangen die Richtlinien der Beschaffungsbehörde eine Code-Coverage von 100%.
Realistisch ist es schwierig, 100 % zu erreichen, aber soweit ich weiß, muss man stattdessen für jede nicht abgedeckte Stelle einzeln begründen, warum sie nicht abgedeckt werden kann.
Die verrückte 100-%-Testabdeckung …
hahaha
Bei Verzweigungen mit
enum/sealed/booleanwurde der Compiler so geändert, dass in Kotlin 1.6 eine Warnung und ab 1.7 ein Fehler ausgegeben wird, wenn sie nicht korrekt behandelt werden.https://youtrack.jetbrains.com/issue/KT-47709
Ich habe den Inhalt in Slash 21 aufmerksam gelesen, haha.
Ah~ das war also Inhalt aus slash 21 ... Ich habe es zuerst auf dem Twitter-Account eines Bekannten gesehen ... Sorry, dass ich so spät dran bin ...