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()
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.
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.
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