Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Simulez le trafic HTTP à l'aide de la rediffusion statique dans le AWS SDK pour Rust
Kit AWS SDK pour Rust Il fournit plusieurs approches pour tester votre code qui interagit avec Services AWS. Cette rubrique décrit comment utiliser le StaticReplayClient
pour créer un faux client HTTP qui peut être utilisé à la place du client HTTP standard normalement utilisé par Services AWS. Ce client renvoie les réponses HTTP que vous spécifiez plutôt que de communiquer avec le service via le réseau, afin que les tests obtiennent des données connues à des fins de test.
La aws-smithy-http-client
caisse inclut une classe utilitaire de test appelée StaticReplayClient
Lors de l'initialisation duStaticReplayClient
, vous fournissez une liste de paires de requêtes et de réponses HTTP sous forme d'ReplayEvent
objets. Pendant le test, chaque requête HTTP est enregistrée et le client renvoie la réponse HTTP suivante trouvée dans la liste d'événements ReplayEvent
en tant que réponse du client HTTP. Cela permet d'exécuter le test en utilisant des données connues et sans connexion réseau.
Utilisation du replay statique
Pour utiliser le replay statique, il n'est pas nécessaire d'utiliser un wrapper. Déterminez plutôt à quoi devrait ressembler le trafic réseau réel pour les données que votre test utilisera, et fournissez ces données de trafic StaticReplayClient
au destinataire chaque fois que le SDK émet une demande du Service AWS client.
Note
Il existe plusieurs méthodes pour collecter le trafic réseau attendu, notamment les analyseurs de trafic réseau AWS CLI et les outils de détection de paquets.
-
Créez une liste d'
ReplayEvent
objets qui spécifient les requêtes HTTP attendues et les réponses qui doivent leur être renvoyées. -
Créez une
StaticReplayClient
en utilisant la liste de transactions HTTP créée à l'étape précédente. -
Créez un objet de configuration pour le AWS client, en le spécifiant
StaticReplayClient
comme étant celui de l'Config
objethttp_client
. -
Créez l'objet Service AWS client en utilisant la configuration créée à l'étape précédente.
-
Effectuez les opérations que vous souhaitez tester à l'aide de l'objet de service configuré pour utiliser le
StaticReplayClient
. Chaque fois que le SDK envoie une demande d'API à AWS, la réponse suivante de la liste est utilisée.Note
La réponse suivante de la liste est toujours renvoyée, même si la demande envoyée ne correspond pas à celle du vecteur d'
ReplayEvent
objets. -
Lorsque toutes les demandes souhaitées ont été effectuées, appelez la
StaticReplayClient.assert_requests_match()
fonction pour vérifier que les demandes envoyées par le SDK correspondent à celles de la liste desReplayEvent
objets.
exemple
Regardons les tests pour la même determine_prefix_file_size()
fonction dans l'exemple précédent, mais en utilisant le replay statique au lieu du simulacre.
-
Dans une invite de commande pour le répertoire de votre projet, ajoutez le
aws-smithy-http-client
crate en tant que dépendance : $
cargo add --dev aws-smithy-http-client --features test-utilL'utilisation de
--dev
cette optionajoute la caisse à la [dev-dependencies]
section de votreCargo.toml
fichier. En tant que dépendance de développement, elle n'est pas compilée et incluse dans votre binaire final utilisé pour le code de production. Cet exemple de code utilise également Amazon Simple Storage Service comme exemple Service AWS.
$
cargo add aws-sdk-s3Cela ajoute la caisse à la
[dependencies]
section de votreCargo.toml
fichier. -
Dans votre module de code de test, incluez les deux types dont vous aurez besoin.
use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient}; use aws_sdk_s3::primitives::SdkBody;
-
Le test commence par créer les
ReplayEvent
structures représentant chacune des transactions HTTP qui doivent avoir lieu pendant le test. Chaque événement contient un objet de requête HTTP et un objet de réponse HTTP représentant les informations auxquelles ils Service AWS répondraient normalement. Ces événements sont transmis dans un appel àStaticReplayClient::new()
:let page_1 = ReplayEvent::new( http::Request::builder() .method("GET") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=test-prefix") .body(SdkBody::empty()) .unwrap(), http::Response::builder() .status(200) .body(SdkBody::from(include_str!("./testing/response_multi_1.xml"))) .unwrap(), ); let page_2 = ReplayEvent::new( http::Request::builder() .method("GET") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=test-prefix&continuation-token=next") .body(SdkBody::empty()) .unwrap(), http::Response::builder() .status(200) .body(SdkBody::from(include_str!("./testing/response_multi_2.xml"))) .unwrap(), ); let replay_client = StaticReplayClient::new(vec![page_1, page_2]);
Le résultat est enregistré dans
replay_client
. Cela représente un client HTTP qui peut ensuite être utilisé par le SDK pour Rust en le spécifiant dans la configuration du client. -
Pour créer le client Amazon S3, appelez la
from_conf()
fonction de la classe client pour créer le client à l'aide d'un objet de configuration :let client: s3::Client = s3::Client::from_conf( s3::Config::builder() .behavior_version(BehaviorVersion::latest()) .credentials_provider(make_s3_test_credentials()) .region(s3::config::Region::new("us-east-1")) .http_client(replay_client.clone()) .build(), );
L'objet de configuration est spécifié à l'aide de la
http_client()
méthode du générateur, et les informations d'identification sont spécifiées à l'aide de lacredentials_provider()
méthode. Les informations d'identification sont créées à l'aide d'une fonction appeléemake_s3_test_credentials()
, qui renvoie une fausse structure d'informations d'identification :fn make_s3_test_credentials() -> s3::config::Credentials { s3::config::Credentials::new( "ATESTCLIENT", "astestsecretkey", Some("atestsessiontoken".to_string()), None, "", ) }
Ces informations d'identification n'ont pas besoin d'être valides car elles ne seront pas réellement envoyées à AWS.
-
Exécutez le test en appelant la fonction à tester. Dans cet exemple, le nom de cette fonction est
determine_prefix_file_size()
. Son premier paramètre est l'objet client Amazon S3 à utiliser pour ses demandes. Par conséquent, spécifiez le client créé à l'aide du systèmeStaticReplayClient
afin que les demandes soient traitées par celui-ci plutôt que de passer par le réseau :let size = determine_prefix_file_size(client, "test-bucket", "test-prefix") .await .unwrap(); assert_eq!(19, size); replay_client.assert_requests_match(&[]);
Lorsque l'appel à
determine_prefix_file_size()
est terminé, un assertion est utilisé pour confirmer que la valeur renvoyée correspond à la valeur attendue. Ensuite, laassert_requests_match()
fonction deStaticReplayClient
méthode est appelée. Cette fonction analyse les requêtes HTTP enregistrées et confirme qu'elles correspondent toutes à celles spécifiées dans le tableau d'ReplayEvent
objets fourni lors de la création du client de rediffusion.
Vous pouvez consulter le code complet de ces exemples