2
votes

Comment écrire des tests unitaires avec des fichiers qui importent directement ou indirectement greengrasssdk

A chaque fois qu'un fichier importe import greengrasssdk , les tests unitaires échouent, car le module greengrass_common n'existe pas sur ma machine locale et je ne peux pas l'installer via pip.

J'exécute les tests avec PyCharm. Le lambda de Greengrass, que j'essaie de tester, ne s'exécute pas localement à cause du même problème de dépendance (même exception). Mais dès que le lambda est poussé vers greengrass, cela fonctionne très bien.

Voici l'exception:

# NONE OF THE THREE PATCH WORK  Not in combination nor single
@mock.patch('greengrass_common')
@mock.patch('greengrass_common.function_arn_fields')
@mock.patch('greengrasssdk')
def test_that(self):
    pass

Voici un exemple de code simplifié: p>

import unittest
import mock
import function

Je reçois le message d'erreur suivant sur le test (Le test est exclu dans un dossier de test, mais aucun autre problème de dépendance n'a encore été montré - j'écris ceci parce que certains développeurs mettent leur tests dans le fichier de code python. J'ai entendu dire que des tests en dehors du fichier de code source pouvaient entraîner des problèmes d'importation. Bien que ce cas soit différent car il se produit également dans le fichier de code d'origine.)

import greengrasssdk
import logging

greengrass_iot_client = greengrasssdk.client('iot-data')
logger = logging.getLogger('logger')

def handler(event, context):
    logger.info('Event handler invoked with event: ' + str(event))


0 commentaires

3 Réponses :


0
votes

Vous pouvez importer greengrasssdk conditionnellement si vous détectez que vous utilisez Greengrass et utilisez boto3 si vous ne l'êtes pas. J'ai écrit un test rapide qui fonctionne pour moi ici et qui ressemble à ceci:

import socket
host = socket.gethostname()

client = None

# Create an IoT data client with Greengrass SDK on Greengrass, boto3 locally
if host == 'sandbox':
  import greengrasssdk
  client = greengrasssdk.client('iot-data')
else:
  import boto3
  client = boto3.client('iot-data')

Essentiellement, vérifiez si le nom d'hôte est signalé comme étant 'sandbox', puis utilisez le SDK Greengrass, sinon utilisez boto3.


0 commentaires

0
votes

J'ai également eu ce problème et utilisez le correctif dans mon fichier conftest.py pour appliquer le correctif sur le SDK Greengrass, par exemple

conftest.py

< pre> XXX

Une fois que vous avez défini MockGreengrassSdk comme MagicMock , vous pouvez alors simuler n'importe quelle méthode que vous voulez. La seule chose dont je ne suis pas sûr est de savoir comment vous changeriez cela par test si vous vouliez des résultats différents du SDK par test.

La façon dont je me suis débrouillé est de créer une façade sur le greengrasssdk sur lequel je peux ensuite simuler les méthodes. Dans ce cas, cette façade doit importer greengrasssdk où le code ci-dessus empêchera vos tests d'échouer.

En résumé:

  1. Créez une façade sur les méthodes greengrasssdk que vous souhaitez utiliser.

  2. Dans la façade, importez le greengrasssdk .

  3. Utilisez le code du patcher dans un fichier conftest.py (comme ci-dessus) pour appliquer le correctif sur le SDK Greengrass.

J'espère que cela vous aidera.


0 commentaires

0
votes

Je viens de rencontrer le même problème et pour moi, cela a fonctionné en entourant l'importation avec une instruction try except.

try:
    import greengrasssdk
    client = greengrasssdk.client('iot-data')
except Exception as e:
    import boto3
    client = boto3.client('iot-data')


0 commentaires