Saltar al contenido principal

Pruebas de Integración con Datos de Mainnet

Probar con datos de mainnet es otra forma de prueba de integración, donde no solo se pueden usar contratos de mainnet, sino también sus datos en mainnet.

Nuestra capacidad para probar un contrato que depende de otro contrato está limitada a nuestro propio conocimiento de este otro contrato y los diferentes estados en los que puede estar. Las pruebas de integración, donde se utilizan dependencias reales, eliminan algunas suposiciones, pero si una dependencia tiene un estado complejo, también puede ser útil probar contra datos de mainnet tal como existen en diferentes momentos.

Probar con datos de mainnet es una forma de cerrar aún más la brecha.

El Soroban Rust SDK y el Stellar CLI se unen para hacer posible las pruebas con datos de mainnet.

Cómo Escribir Pruebas con Datos de Mainnet

El siguiente es un ejemplo de una prueba que incluye un contrato de dependencia en la prueba, en lugar de simularlo. La prueba está escrita para probar el contrato increment-with-pause y el contrato pause. El contrato tiene una función increment que aumenta el valor de un contador en uno en cada invocación. El contrato depende del contrato pause para controlar si la funcionalidad de incremento está pausada.

Las siguientes pruebas configuran el contrato increment-with-pause, utilizando una imagen del ledger que ya tiene el contrato de dependencia pause implementado junto con sus datos del contrato.

  1. Usa el comando [stellar snapshot create] para crear una imagen del contrato pause y sus datos.

    stellar snapshot create --address C... --output json --out snapshot.json
    información

    La opción --ledger <ledger-seq> se puede agregar para especificar un ledger a capturar. Cuando no se especifica, se captura el último ledger que se ha enviado a archivos, que generalmente tiene menos de 5 minutos.

  2. Usa Env::from_ledger_snapshot_file(...) para cargar la imagen en un Env en la prueba.

    let env = Env::from_ledger_snapshot_file("snapshot.json");
  3. Escribe una prueba similar a la siguiente que use el Env precargado con los contratos y los datos del contrato en snapshot.json. La prueba realiza afirmaciones sobre el comportamiento del contrato principal en el contexto de las dependencias reales y los datos que estas tienen en la red.

    #[test]
    fn test() {
    let env = Env::from_ledger_snapshot_file("snapshot.json");

    let contract_id = env.register(
    IncrementContract,
    IncrementContractArgs::__constructor(&pause_id),
    );
    let client = IncrementContractClient::new(&env, &contract_id);

    assert_eq!(client.increment(), 1);
    }

La mayoría de las pruebas, ya sean unitarias, simuladas o de integración, se verán muy similares a la prueba anterior. Las pruebas harán cuatro cosas:

  1. Crear un entorno, el Env, ya sea con Env::default() o Env::from_ledger_snapshot_file(...).
  2. Registrar el/los contrato(s) a probar.
  3. Invocar funciones usando el cliente generado.
  4. Afirmar el resultado.
consejo

Las imágenes creadas desde testnet o mainnet también pueden ser una forma de probar y depurar incidentes con un contrato en la red. Se puede crear una imagen en un ledger específico y escribir pruebas usando esa imagen para entender mejor por qué o cómo ocurrió una serie de eventos.

consejo

Se puede crear una imagen de cualquier contrato implementado en mainnet o testnet usando el comando stellar snapshot create. Puede ser una forma divertida de experimentar y aprender sobre contratos implementados al cargar una imagen en una prueba e invocar el contrato. Fuzzing incluso se puede realizar en contratos usando esta herramienta.