Verzeichnisstruktur für die testgetriebene Entwicklung mit pytest in python

Gliederung

Es ist nur ein Bulletin.

Das Wichtigste ist, ob Sie "aus ... importieren ..." können. Das Verzeichnis des selbst erstellten Moduls und Wenn beide Testmodul-Verzeichnishierarchien tief sind.

Es scheint, dass sich das Verhalten in 3 oder mehr Schichten ändert.

Geschichte

Der Beispielcode, wenn die Hierarchie tief ist, entspricht der folgenden Struktur: Ich konnte es nicht finden, selbst wenn ich es gegoogelt habe, also schrieb ich es als Artikel.

.
├tests
│├mod
││└test_module.py
├src
│├mod
││└module.py

Ich habe viele Dinge wie die folgenden gesehen.

.
├tests
│└test_module.py
├src
│└module.py

geht nicht gut

Was ich tun möchte ist Wie führe ich unittest mit pytest aus, um Modulcode und Testcode in Verzeichnissen zu trennen? Diese Methode erfordert jedoch die Angabe von Modulausführungsoptionen.

In launch.json müssen Sie die Debug-Konfiguration aller Muster für die Anzahl der Module beschreiben. Es scheint kein Problem zu geben, wenn es sich um ein kleines Projekt wie ein Tutorial handelt. Je größer das Projekt, desto mehr Unsinn ist es.

Verzeichnisaufbau

Der Inhalt der Datei __init __. Py ist leer. Außerdem ist "__init __. Py" nicht erforderlich. Auch hier funktioniert es gut ohne "__init __. Py", und die Intelligenz funktioniert. image.png

Prüfung

Dies ist der eigentliche Test.

test_name.py


import pytest
from src.animal.mammal import human
from src.star import satellite

def test_human_name():
    target=human("Jane Doe")
    ans=target.name
    assert ans=="Jane Doe"

def test_satellite_name():
    target=satellite("lua")
    ans=target.name
    assert ans=="lua"

def test_human_foot_count():
    ans=human.howmanyfoot()
    assert ans==2

if __name__ == "__main__":
    pass

Zu testendes Modul

star.py


class satellite():

    def __init__(self, name:str):
        self.name=name

    def name(self) -> str:
        return self.name

class planet():

    def __init__(self, name:str):
        self.name=name

    def name(self) -> str:
        return self.name

mammal.py


class human():
    def __init__(self, name:str):
        self.name=name

    @classmethod
    def name(self) -> str:
        return self.name
    
    @staticmethod
    def howmanyfoot() -> int:
        return 2

Pfadeinstellung

Dies ist eine Fehlerumgehung bei der Verarbeitung "vom Import" der "aktuellen Datei beim Debuggen". Wenn man dies ausdrückt, scheint es, dass es "Python-Pfad" und "selbst erstellte Module anderer Ebenen" erkennt.

.env


PYTHONPATH=./

Es erkennt auch, wenn Sie eine virtuelle Umgebung wie conda verwenden.

Wenn Sie das folgende Skript ausführen, Sie können sehen, ob die Umgebung erkannt wird.

import_test.py


import sys
print(sys.path)

Als Ergebnis der Ausführung der obigen import_test.py, Es ist in Ordnung, wenn . / Src / enthalten ist.

Debug-Konfiguration

Es werden drei Arten von Debugging-Methoden definiert. Von oben nach unten

--Testname Modul-Debugging

Meiner persönlichen Meinung nach ist das Debuggen von Modulen Es ist auf Anwendungen wie die Angabe des Hauptmoduls beschränkt.

In den meisten Fällen drücken Sie die Taste "F5" auf der Registerkarte, die bearbeitet wird, um die aktuelle Datei zu debuggen → Führen Sie den Test aus.

launch.json


{
    //Mit IntelliSense können Sie die verfügbaren Attribute kennenlernen.
    //Bewegen Sie den Mauszeiger und zeigen Sie die Beschreibung der vorhandenen Attribute an.
    //Überprüfen Sie das Folgende für weitere Informationen: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "Python:Modultest_name",
            "type": "python",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "module": "tests.test_mod.test_name"
        },{
            "name": "Python:Modul Säugetier",
            "type": "python",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "module": "src.animal.mammal"
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

Arbeitsbereichseinstellungen

settings.json


{
    "python.testing.pytestArgs": [
        "tests"
    ],
    "python.testing.unittestEnabled": false,
    "python.testing.nosetestsEnabled": false,
    "python.testing.pytestEnabled": true,
    "python.envFile": "${workspaceFolder}/.env"
}

Wenn Sie genau hinschauen, können Sie sehen, dass der Speicherort von ".env" standardmäßig angegeben ist.

image.png

Testergebnisse

image.png

Umgebung

Excelsior!

Recommended Posts

Verzeichnisstruktur für die testgetriebene Entwicklung mit pytest in python
Hinweise zur Verwendung von Python (Pydev) mit Eclipse
C sprachähnliche Struktur in Python
Framework-Entwicklung mit Python
Entwicklungsumgebung in Python
Slackbot-Entwicklung in Python
Entwicklung des AWS SDK für Python (Boto3) in Visual Studio 2017
Techniken zum Sortieren in Python
Python-Entwicklung mit Visual Studio 2017
[Zum Organisieren] Python-Entwicklungsumgebung
Python-Entwicklung mit Visual Studio
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Über "für _ in range ():" von Python
Erstellen einer Entwicklungsumgebung für Android-Apps - Erstellen von Android-Apps mit Python
Explosive Geschwindigkeit! Verwenden von Python Simple HTTP Server für die Kintone-Entwicklung
Überprüfen Sie Python auf Speicherlecks
Dinge, auf die Sie achten müssen, wenn Sie Standardargumente in Python verwenden
GUI-Programmierung in Python mit Appjar
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 5 ~
Suchen Sie mit Python nach externen Befehlen
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps in Python ~ Indexseite ~
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps mit Python ~ Django Tutorial 4 ~
Erstellen Sie mit dem Serverless Framework eine lokale Entwicklungsumgebung für Lambda + Python
Verwenden Sie Watchdog (Watchmedo) in der testgetriebenen Entwicklung
Versuchen Sie es mit LevelDB mit Python (plyvel)
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 1, 2, 3 ~
Optionen für die Python-Entwicklungsumgebung für Mai 2020
Verwendung globaler Variablen in Python-Funktionen
[TouchDesigner] Tipps für die Anweisung von Python
Emacs-Einstellungen für die Python-Entwicklungsumgebung
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 6 ~
Mal sehen, wie man Eingaben in Python verwendet
Gesamtleistung in Python (mit Funktools)
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 7 ~
[Python] Grund für das Überschreiben mit super ()
Führen Sie unittest in Python aus (für Anfänger)
[Python] Neunundneunzig Tabellen, die for-Anweisungen verwenden
Handschriftliche Zeichenerkennung mit KNN in Python
[Pytest] [mock] Anfänger in der Webentwicklung fassten den Unit-Test und den Mock in Python zusammen.
Versuchen Sie es mit LeapMotion mit Python
Suche nach Tiefenpriorität mit Stack in Python
Bei Verwendung regulärer Ausdrücke in Python
Versuchen Sie vorerst, FireBase Cloud Firestore mit Python zu verwenden
Befehl für das aktuelle Verzeichnis Python
GUI-Erstellung in Python mit tkinter 2
Bereiten Sie eine Python-Entwicklungsumgebung für jedes Projekt in einer Windows-Umgebung vor (VSCode + virtualEnvWrapper + Pylint).
Entwicklung und Bereitstellung der REST-API in Python mit Falcon Web Framework
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Versuchen Sie es mit der Wunderlist-API in Python
GUI-Erstellung in Python mit tkinter Teil 1
Holen Sie sich Suica Balance in Python (mit libpafe)
Übung, dies in Python zu verwenden (schlecht)
Hash-Passwörter langsam mit bcrypt in Python