Common Mock von Moto im Unit-Test von Python

1. Motivation

Ich dachte, es wäre überflüssig, beim Erstellen des Testcodes mit jedem Testcode ein Modell zu erstellen, also habe ich versucht, es allgemein zu machen. Unten finden Sie eine Beispiel-App und einen Beispiel-Testcode zu Beginn. Machen Sie die EC2-Erstellung zu einem Teil des Testcodes.

--App: Erfasst EC2-Informationen und gibt sie aus

app.py


import boto3


def main():
    client = boto3.client('ec2')
    #Holen Sie sich alle Instanzinformationen.
    instances = client.describe_instances()
    #Extrahieren Sie den Instanznamen.
    instace_name = [instance['KeyName'] for r in instances.get('Reservations') for instance in r.get('Instances')]
    #Name der Ausgabeinstanz
    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')
        #Legen Sie die Bedingungen für die Erstellung von EC2 fest
        ec2objects = [
            {'KeyName': 'test_ec2_name_1'}
        ]
        #Erstellen Sie EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))
        #Führen Sie die App aus
        app.main()

    @mock_ec2
    def test_case_2(self):
        client = boto3.client('ec2')
        #Legen Sie die Bedingungen für die Erstellung von EC2 fest
        ec2objects = [
            {'KeyName': 'test_ec2_name_2'}
        ]
        #Erstellen Sie EC2
        for o in ec2objects:
            client.run_instances(
                ImageId='ami-03cf127a',
                MinCount=1,
                MaxCount=1,
                KeyName=o.get('KeyName'))
        #Führen Sie die App aus
        app.main()


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

2. Versuchen Sie es mit der setUp-Methode

Schreiben Sie den Code zum Erstellen von EC2 in die setUp-Methode und versuchen Sie, EC2 zu erstellen, bevor Sie den Testfall ausführen.

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')
        #Legen Sie die Bedingungen für die Erstellung von EC2 fest
        ec2objects = [
            {'KeyName': 'test_ec2_name_1'}
        ]
        #Erstellen Sie 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):
        #Führen Sie die App aus
        app.main()

    @mock_ec2
    def test_case_2(self):
        #Führen Sie die App aus
        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

Der EC2-Name wird nicht ausgegeben. Das Ablaufdatum des Mocks von moto scheint bis zum Ende der Methode zu sein, und wenn es in der setUp-Methode beschrieben wird, verschwindet das Mock am Ende der setUp-Methode. Infolgedessen existiert kein Mock, wenn der Testfall ausgeführt wird.

3. Erstellen Sie eine gemeinsame Klasse und führen Sie sie mit jeder Methode aus

Aus den Ergebnissen im vorherigen Abschnitt haben wir gelernt, dass Mock ohne Testfälle erstellt werden muss. Erstellen Sie daher eine gemeinsame Klasse und versuchen Sie, die Methoden in der gemeinsamen Klasse für jeden Fall auszuführen.

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')
        #Legen Sie die Bedingungen für die Erstellung von EC2 fest
        ec2objects = [
            {'KeyName': name}
        ]
        #Erstellen Sie 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):
        #Erstellen Sie EC2
        self.common.enviroment_1('test_ec2_name_1')
        #Führen Sie die App aus
        app.main()

    @mock_ec2
    def test_case_2(self):
        #Erstellen Sie EC2
        self.common.enviroment_1('test_ec2_name_2')
        #Führen Sie die App aus
        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

Ich konnte es auf nette Weise teilen und die erwarteten Ergebnisse wurden zurückgegeben. Das Erstellen einer gemeinsamen Klasse erhöht jedoch die Anzahl der Codes, daher möchte ich es etwas einfacher machen.

4. Erstellen Sie eine allgemeine Methode in der Testklasse

Zunächst wird mir klar, dass es am schnellsten ist, wenn ich eine andere Methode als den Testfall in der Testklasse erstellen kann.

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):
        #Erstellen Sie EC2
        self.__common('test_ec2_name_1')
        #Führen Sie die App aus
        app.main()

    @mock_ec2
    def test_cace_2(self):
        #Erstellen Sie EC2
        self.__common('test_ec2_name_2')
        #Führen Sie die App aus
        app.main()

    def __common(self, name):
        client = boto3.client('ec2')
        #Legen Sie die Bedingungen für die Erstellung von EC2 fest
        ec2objects = [
            {'KeyName': name}
        ]
        #Erstellen Sie 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

erledigt. Dies ist die klügste Gemeinsamkeit, die jetzt gemacht werden kann.

Recommended Posts

Common Mock von Moto im Unit-Test von Python
Unittest in Python
Unittest und CI in Python
Sortieren nach Datum in Python
[Python] Testbeispiel mit unittest2, mock
Führen Sie das Python-Unittest-Modul in vs2017 aus
Lesen Sie die Datei Zeile für Zeile mit Python
Automatisieren Sie Jobs, indem Sie Dateien in Python bearbeiten
Ausrichtungsalgorithmus durch Einfügemethode in Python
Szenenerkennung nach GIST-Feature-Quantität in Python
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
Metaanalyse in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
Schritt AIC in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
Teilen Sie Kamelfallzeichenfolgen in Python Wort für Wort
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Implementiert in Python PRML Kapitel 4 Klassifizierung nach Perceptron-Algorithmus
So führen Sie Tests zusammen mit Python unittest aus
[Maya Python] Anzeige .ui erstellt von Qt Designer in Maya
[Python] Rufen Sie das Element ab, indem Sie das Namensattribut in BeautifulSoup angeben
Wie man setUp nur einmal in Python unittest ausführt
Verschieben Sie die Alphabetzeichenfolge in Python um N Zeichen
gitwatch> python> Top 30 Python-Projekte in GitHub> 19. Oktober 2014 VON DSK
Gruppieren Sie nach aufeinanderfolgenden Elementen einer Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python