Simulation commune par moto dans le test unitaire de Python

1. Motivation

Je pensais qu'il serait redondant de créer une maquette avec chaque code de test lors de la création du code de test, alors j'ai essayé et essayé de le rendre commun. Voici un exemple d'application et un exemple de code de test au début. Rendre la création EC2 une partie du code de test commune.

--App: acquiert et sort des informations EC2

app.py


import boto3


def main():
    client = boto3.client('ec2')
    #Obtenez toutes les informations sur l'instance.
    instances = client.describe_instances()
    #Extrayez le nom de l'instance.
    instace_name = [instance['KeyName'] for r in instances.get('Reservations') for instance in r.get('Instances')]
    #Nom de l'instance de sortie
    print(instace_name)

test.py


import unittest
import boto3
from moto import mock_ec2
from app import app


class MyTestCase(unittest.TestCase):
    @mock_ec2
    def test_case_1(self):
        client = boto3.client('ec2')
        #Définir les conditions de création d'EC2
        ec2objects = [
            {'KeyName': 'test_ec2_name_1'}
        ]
        #Créer EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))
        #Exécutez l'application
        app.main()

    @mock_ec2
    def test_case_2(self):
        client = boto3.client('ec2')
        #Définir les conditions de création d'EC2
        ec2objects = [
            {'KeyName': 'test_ec2_name_2'}
        ]
        #Créer EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))
        #Exécutez l'application
        app.main()


if __name__ == '__main__':
    unittest.main()

2. Essayez d'utiliser la méthode setUp

Écrivez le code pour créer EC2 dans la méthode setUp et essayez de créer EC2 avant d'exécuter le scénario de test.

test.py


import unittest
import boto3
from moto import mock_ec2
from app import app


class MyTestCase(unittest.TestCase):
    @mock_ec2
    def setUp(self):
        client = boto3.client('ec2')
        #Définir les conditions de création d'EC2
        ec2objects = [
            {'KeyName': 'test_ec2_name_1'}
        ]
        #Créer EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))

    @mock_ec2
    def test_case_1(self):
        #Exécutez l'application
        app.main()

    @mock_ec2
    def test_case_2(self):
        #Exécutez l'application
        app.main()


if __name__ == '__main__':
    unittest.main()

result.


test_case_1 (tests.test_setUp.MyTestCase) ... []
ok
test_case_2 (tests.test_setUp.MyTestCase) ... []
ok

----------------------------------------------------------------------
Ran 2 tests in 0.458s

OK

Le nom EC2 n'est pas émis. La date d'expiration de la maquette par moto semble se situer jusqu'à la fin de la méthode, et si elle est décrite dans la méthode setUp, la maquette disparaîtra à la fin de la méthode setUp. Par conséquent, la simulation n'existe pas lorsque le scénario de test est exécuté.

3. Créez une classe commune et exécutez-la à partir de chaque méthode

À partir des résultats de la section précédente, nous avons constaté que la simulation doit être créée sans cas de test, alors créez une classe commune et essayez d'exécuter les méthodes de la classe commune à partir de chaque cas.

test.py


import unittest
import boto3
from moto import mock_ec2
from app import app


class common:
    @staticmethod
    def enviroment_1(name):
        client = boto3.client('ec2')
        #Définir les conditions de création d'EC2
        ec2objects = [
            {'KeyName': name}
        ]
        #Créer EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))


class MyTestCase(unittest.TestCase):

    @mock_ec2
    def setUp(self):
        self.common = common

    @mock_ec2
    def test_case_1(self):
        #Créer EC2
        self.common.enviroment_1('test_ec2_name_1')
        #Exécutez l'application
        app.main()

    @mock_ec2
    def test_case_2(self):
        #Créer EC2
        self.common.enviroment_1('test_ec2_name_2')
        #Exécutez l'application
        app.main()


if __name__ == '__main__':
    unittest.main()

result.


test_case_1 (tests.test_common.MyTestCase) ... ['test_ec2_name_1']
ok
test_case_2 (tests.test_common.MyTestCase) ... ['test_ec2_name_2']
ok

----------------------------------------------------------------------
Ran 2 tests in 0.489s

OK

J'ai pu le partager de manière agréable et les résultats que j'attendais ont été renvoyés. Cependant, la création d'une classe commune augmente le nombre de codes, donc je veux le rendre un peu plus facile.

4. Créez une méthode commune dans la classe de test

En premier lieu, je réalise enfin que c'est le plus rapide si je peux créer une méthode commune autre que le cas de test dans la classe de test.

test.py


import unittest
import boto3
from moto import mock_ec2
from app import app


class MyTestCase(unittest.TestCase):
    @mock_ec2
    def test_cace_1(self):
        #Créer EC2
        self.__common('test_ec2_name_1')
        #Exécutez l'application
        app.main()

    @mock_ec2
    def test_cace_2(self):
        #Créer EC2
        self.__common('test_ec2_name_2')
        #Exécutez l'application
        app.main()

    def __common(self, name):
        client = boto3.client('ec2')
        #Définir les conditions de création d'EC2
        ec2objects = [
            {'KeyName': name}
        ]
        #Créer EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))


if __name__ == '__main__':
    unittest.main()

result.


test_case_1 (tests.test.MyTestCase) ... ['test_ec2_name_1']
ok
test_case_2 (tests.test.MyTestCase) ... ['test_ec2_name_2']
ok

----------------------------------------------------------------------
Ran 2 tests in 0.361s

OK

l'a fait. C'est le point commun le plus intelligent qui puisse être fait maintenant.

Recommended Posts

Simulation commune par moto dans le test unitaire de Python
Unittest en Python
Unittest et CI en Python
Trier par date en python
[Python] Exemple de test avec unittest2, simulé
Exécuter le module Python unittest dans vs2017
Lisez le fichier ligne par ligne avec Python
Automatisez les tâches en manipulant des fichiers en Python
Algorithme d'alignement par méthode d'insertion en Python
Reconnaissance de scène par quantité de fonctionnalités GIST en Python
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
Méta-analyse en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Étape AIC en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
Séparer les chaînes de cas de chameau mot par mot en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Implémenté en Python PRML Chapitre 4 Classification par algorithme Perceptron
Comment exécuter des tests avec Python unittest
[Maya Python] Display .ui créé par Qt Designer dans Maya
[Python] Récupère l'élément en spécifiant l'attribut name dans BeautifulSoup
Comment exécuter setUp une seule fois dans Python Unittest
Décale la chaîne de l'alphabet de N caractères en Python
gitwatch> python> Top 30 des projets Python dans GitHub> 19 OCT 2014 PAR DSK
Regrouper par éléments consécutifs d'une liste en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python