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()
É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é.
À 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.
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