Seite 1 von 1

Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 14:31
von juli0512
Hallo Zusammen,

ich brauche eure Hilfe. Ich habe ein Programm geschrieben, welches die API von Have I been Pwned kontaktiert und mir zurück gibt ob und wie oft das eingegebene Passwort geleakt wurde.
Funktioniert auch super. Jetzt bin ich dabei Unit Tests zu schreiben. Habe sowas noch nie gemacht und es funktioniert einfach nicht. Wobei ich auch nicht richtig weiß, was ich prüfen soll. Habe viel gegoogelt aber dort werden meistens ja nur Zahlen auf Gleichheit geprüft. Ich wollte jetzt z.B. prüfen ob in meiner Eingabe überhaupt was drin steht. Geht nicht. Ich glaub ich mach was grundlegendes falsch.
Hier mal der Text:

Code: Alles auswählen

import unittest
from HIBP import api_zugriff
from HIBP import main



class Test(unittest.TestCase):
    


    def Connectiontest(self):
        self.assertIsNone(api_zugriff(), 'Eingabe ist leer')


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

Re: Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 15:35
von __blackjack__
@juli0512: Ich würde von `unittest` abraten und ``pytest`` installieren und verwenden. Das ist einfacher und ”pythonischer” zu nutzen. Da sähe der Test dann einfach so aus:

Code: Alles auswählen

from HIBP import api_zugriff


def test_api_zugriff_without_arguments():
    assert api_zugriff() is None
Wobei der Name `api_zugriff()` nicht wirklich gut ist. Das beschreibt mehr ein Ding (der API-Zugriff) als eine Tätigkeit (greife auf API zu) und ist auch sehr nichtssagend. Und sollte man diese Funktion tatsächlich ohne Argumente aufrufen können und dann gibt die einfach `None` zurück? Das erscheint mir nicht so wirklich sinnvoll.

Zudem hast Du hier ein Modul das eine externe API verwendet und Unitttests sollten nicht *die* testen, sondern *Deinen* Code. Das heisst hier fehlt Code der die externe API ”mockt”, damit da nicht tatsächlich auf den (fremden) Webserver/-service zugegriffen wird. Die Tests müssen a) auch völlig ohne Netzzugang funktionieren, und b) sollten die dann auch alle möglichen Rückgaben von der API testen, also beispielsweise auch wenn der Server mit einem Fehler antwortet. Dazu braucht man dann ja zwingend ”Mocks” von der API.

Re: Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 16:20
von juli0512
@__blackjack__ und wie würde die Syntax dafür aussehen? Fühl mich grad wirklich dumm, hab noch nie was von mocken gehört :/

Re: Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 16:21
von juli0512
Und nein sie soll nicht none zurück geben sondern einen Fehler aber der Test macht einfach gar nix!

Re: Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 16:32
von Sirius3
So soll es ja auch sein, ein Test, der funktioniert, macht gar nichts, ein Test der nicht funktioniert wirft eine Exception.

Wie Mockup-Methoden aussehen, hängt halt von der wirklichen Funktion ab. Die Funktion sieht von außen gleich aus, und intern liefert sie halt plausible Werte zurück.

Re: Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 16:34
von __blackjack__
@juli0512: Was denn für einen Fehler? Und warum? Du meinst aber jetzt nicht den normalen `TypeError` denn man bekommt wenn man eine Funktion aufruft die ein Argument erwartet und das keinen Defaultwert hat oder? Denn das ist nicht Deine Aufgabe zu testen ob *Python* funktioniert. Das sollte man genau wie das die externe API angeht, als gegeben hinnehmen. Man schreibt nur Tests die den *eigenen* Code prüfen.

Zu dem `unittest` kann ich jetzt nichts sagen, weil ich das nicht verwende.

Re: Have I been Pwned Unit Tests

Verfasst: Samstag 6. Juni 2020, 17:35
von __blackjack__
@juli0512: Das „der Test macht einfach gar nix“ stimmt ja so nicht ganz. Es gibt keinen Test. Denn wenn man das laufen lässt, erhält man ja eine Ausgabe, die Du auch ruhig hättest verraten können:

Code: Alles auswählen

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Das nächste bei einer sinnvollen Fehlerbeschreibung ist eine Beschreibung wo denn das tatsächliche Verhalten vom beobachteten abweicht und warum man davon überrascht ist. Ich nehme mal an die Abweichung ist die Ausgabe das null Tests gelaufen sind. Warum hast Du da etwas anderes erwartet? Woher soll das `unittest`-Modul denn wissen was es machen soll, also das es die Methode `Connectiontest` aufrufen soll?

Lies Dir dazu mal die Dokumentation vom `unittest`-Modul durch. Gleich am Anfang ist ein grundlegendes Beispiel mit einer Beschreibung. Daraus sollte schon klar werden warum das bei Dir nicht funktioniert und was man ändern muss, damit es funktioniert.

Ich würde trotzdem zu ``pytest`` raten. `unittest` ist einfach ziemlich ”unpythonisch”. Das sieht man schon an der schreibweise der Methodennamen und das man da alles in Klassen stopfen muss. Das ist halt sehr ”javaesque”.

Eventuell solltest Du auch mal einen Blick in den Style Guide for Python Code werfen, falls Du noch mehr Namen hast die mit einem Grossbuchstaben anfangen, kleinbuchstaben enthalten, aber keine Klassen sind.