Structure de répertoire pour le développement piloté par les tests à l'aide de pytest en python

Contour

C'est juste un bulletin.

La chose la plus importante est de savoir si vous pouvez faire "depuis ... importer ...". Le répertoire du module personnalisé et Lorsque les deux hiérarchies de répertoires du module de test sont profondes.

Il semble que le comportement change en 3 couches ou plus.

récit

L'exemple de code lorsque la hiérarchie est profonde comme la structure suivante, Je ne pouvais pas le trouver même si je le recherchais sur Google, alors je l'ai écrit sous forme d'article.

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

J'ai vu beaucoup de choses comme les suivantes.

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

ne va pas bien

Ce que je veux faire c'est Comment exécuter unittest avec pytest pour séparer le code de module et le code de test dans les répertoires? Cependant, cette méthode nécessite la spécification des options d'exécution du module.

Dans launch.json, vous devez décrire la configuration de débogage de tous les modèles pour le nombre de modules. Il semble qu'il n'y ait pas de problème s'il s'agit d'un petit projet comme un tutoriel, Plus le projet est gros, plus il est absurde.

Structure du répertoire

Le contenu du fichier __init __. Py est vide. De plus, «__init __. Py» n'est pas nécessaire. Encore une fois, cela fonctionne bien sans __init __. Py, et l'intelligence fonctionne. image.png

tester

C'est le test réel.

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

Module à tester

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

Réglage du chemin

Il s'agit d'une solution de contournement d'erreur lors du traitement de «depuis l'importation» du «fichier Currrent lors du débogage». En mettant cela, il semble qu'il reconnaîtra "Python path" et "self-made modules of other layers".

.env


PYTHONPATH=./

Il reconnaît même si vous utilisez un environnement virtuel tel que conda.

Si vous exécutez le script suivant, Vous pouvez voir si l'environnement est reconnu.

import_test.py


import sys
print(sys.path)

Suite à l'exécution de ʻimport_test.pyci-dessus, C'est OK si. / Src /` est inclus.

Configuration de débogage

Il définit trois types de méthodes de débogage. Du haut jusqu'en bas

À mon avis, le débogage du module est Il est limité aux applications telles que la spécification du module principal.

Dans la plupart des cas, appuyez sur la touche F5 de l'onglet en cours d'édition pour déboguer le fichier actuel → lancer le test.

launch.json


{
    //Vous pouvez utiliser IntelliSense pour apprendre les attributs disponibles.
    //Survolez et affichez la description des attributs existants.
    //Vérifiez les éléments suivants pour plus d'informations: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "Python:Test de module_name",
            "type": "python",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "module": "tests.test_mod.test_name"
        },{
            "name": "Python:Module mammifère",
            "type": "python",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "module": "src.animal.mammal"
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

Paramètres de l'espace de travail

settings.json


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

Si vous regardez attentivement, vous pouvez voir que l'emplacement de .env est spécifié par défaut.

image.png

résultats de test

image.png

environnement

Excelsior!

Recommended Posts

Structure de répertoire pour le développement piloté par les tests à l'aide de pytest en python
Remarques sur l'utilisation de python (pydev) avec eclipse
Structure de type langage C en Python
Développement de framework avec Python
Environnement de développement en Python
Développement Slackbot en Python
Développement du kit SDK AWS pour Python (Boto3) dans Visual Studio 2017
Techniques de tri en Python
Développement Python avec Visual Studio 2017
[Pour organiser] Environnement de développement Python
Développement Python avec Visual Studio
Traduit à l'aide de googletrans en Python
Utilisation du mode Python dans le traitement
À propos de "for _ in range ():" de python
Création d'un environnement de développement pour les applications Android - Création d'applications Android avec Python
Vitesse explosive! Utilisation de Python Simple HTTP Server pour le développement Kintone
Rechercher les fuites de mémoire dans Python
Choses à surveiller lors de l'utilisation d'arguments par défaut en Python
Programmation GUI en Python avec Appjar
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 5 ~
Rechercher des commandes externes avec python
Précautions lors de l'utilisation de Pit avec Python
Historique d'apprentissage pour participer au développement d'applications d'équipe en Python ~ Page d'index ~
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 4 ~
Créer un environnement de développement local pour Lambda + Python à l'aide de Serverless Framework
Utiliser watchdog (watchmedo) dans le développement piloté par les tests
Essayez d'utiliser LevelDB avec Python (plyvel)
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 1, 2, 3 ~
Options d'environnement de développement Python pour mai 2020
Utilisation de variables globales dans les fonctions python
[TouchDesigner] Conseils pour la déclaration par python
Paramètres Emacs pour l'environnement de développement Python
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 6 ~
Voyons voir l'utilisation de l'entrée en python
Puissance totale en Python (en utilisant functools)
Historique d'apprentissage pour participer au développement d'applications d'équipe en Python ~ Tutoriel Django 7 ~
[Python] Raison du remplacement à l'aide de super ()
Exécutez unittest en Python (pour les débutants)
[Python] Quatre-vingt-dix-neuf tables utilisant des instructions for
Reconnaissance de caractères manuscrits à l'aide de KNN en Python
[Pytest] [mock] Les débutants en développement Web ont résumé le test unitaire et simulé en python.
Essayez d'utiliser LeapMotion avec Python
Recherche de priorité de profondeur à l'aide de la pile en Python
Lors de l'utilisation d'expressions régulières en Python
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment
Commande pour le répertoire courant Python
Création d'interface graphique en python avec tkinter 2
Préparer un environnement de développement Python pour chaque projet dans un environnement Windows (VSCode + virtualEnvWrapper + Pylint)
Développement et déploiement de l'API REST en Python à l'aide de Falcon Web Framework
Une note utile lors de l'utilisation de Python après une longue période
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Essayez d'utiliser l'API Wunderlist en Python
Création d'interface graphique en python à l'aide de tkinter partie 1
Obtenir l'équilibre Suica en Python (en utilisant libpafe)
Pratique d'utilisation de ceci en Python (mauvais)
Hachez lentement les mots de passe en utilisant bcrypt en Python