8 Punkte von ohjongin 2022-06-22 | 9 Kommentare | Auf WhatsApp teilen

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

 
youknowone 2022-06-23

Es wirkt irgendwie wie eine Verkehrung von Mittel und Zweck, den Code zu verbiegen, nur um 100 % Coverage-Tracking zu erreichen.

 
innoceive 2022-06-23

Der Code ist nicht verbogen. Es gibt nur andere Wege, die aus menschlicher Sicht bequemer sind.

 
regentag 2022-06-23

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.

 
doldari 2022-06-22

Die verrückte 100-%-Testabdeckung …

 
roxie 2022-06-23

hahaha

 
ganadist 2022-06-22

Bei Verzweigungen mit enum / sealed / boolean wurde 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

 
525hm 2022-06-22

Ich habe den Inhalt in Slash 21 aufmerksam gelesen, haha.

 
ohjongin 2022-06-22

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 ...