2017-12-24 8 views
4

Betrachten wir diese Funktion unter Test im module.py gelegen haben:Code Coverage und Ternary Operatoren

def f(a, b): 
    return (a - b) if a > b else 1/0 

Und wir folgende Testfall im test_module.py haben:

from unittest import TestCase 

from module import f 


class ModuleTestCase(TestCase): 
    def test_a_greater_than_b(self): 
     self.assertEqual(f(10, 5), 5) 

Wenn wir Tests durchführen mit pytest mit der aktivierten "Zweigabdeckung" mit der HTML-Ausgabe Berichterstattung:

pytest test_module.py --cov=. --cov-branch --cov-report html 

Der Bericht wird zu 100% Zweigüberdeckung Anspruch mit allen „teilweise“ Zweig bedeckt:

enter image description here

Aber wir haben den else 1/0 Teil überhaupt klar nicht abgedeckt.

Gibt es eine Möglichkeit, die Berichterstattung zu verbessern, um die nicht abgedeckten Teile der ternären Betreiber zu sehen?

+2

Im Gegensatz zur Schlüsselwortversion ist die Operatorversion von 'if' /' else' keine Kontrollstruktur, sondern eine boolesche Operation. Die tatsächliche Kontrollstruktur ist in der Implementierung der Operation verborgen, außerhalb des Sichtbereichs der Abdeckung. Ich stimme zu, dass es eine gute Idee wäre, dies in das "Coverage" -Paket umzusetzen. –

Antwort

3

Die Zweigüberdeckung kann nur die Verzweigung von einer Zeile zur anderen messen, da Pythons Trace-Einrichtung derzeit nur die Verfolgung pro Zeile unterstützt. Python 3.7 führt einige Trace auf Bytecode-Ebene ein, aber es würde erhebliche Arbeit erfordern, es zu verwenden.

https://bitbucket.org/ned/coveragepy/issues/606/variable-assignment-with-an-if-else ist ein geschlossenes Problem darüber.

+0

Jetzt, da Python 3.7 in der Vorabversion ist, sollte das referenzierte Problem nicht wieder geöffnet werden (ich frage, weil ich sehe, dass Sie der Betreuer sind)? PS. "geöffnet"! = "sofort gelöst", aber es ist sicherlich ein wichtiges Merkmal, nicht? – Axel

+0

Es wäre besser, das Thema zu diskutieren, nein? –