Saltar al contenido principal

Pruebas de Fork

Las pruebas de bifurcación son otra forma de [pruebas de integración], donde no solo se pueden utilizar contratos de mainnet, sino también sus datos en mainnet. Se toma una imagen del ledger y se utiliza para crear un entorno para las pruebas. La prueba opera como un fork de ese estado inicial.

Nuestra capacidad para probar un contrato que depende de otro contrato se limita a nuestro propio conocimiento de este otro contrato y de los diferentes estados en los que puede entrar. 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 desplegado junto con los datos de su contrato.

  1. Utiliza el comando [stellar snapshot create] para crear una imagen del contrato de pausa 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 para la imagen. Cuando no se especifica, el último ledger que se ha enviado a archivos es la imagen, que generalmente tiene menos de 5 minutos.

  2. Utiliza 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 utilice el Env precargado con los contratos y los datos del contrato en snapshot.json. La prueba hace afirmaciones sobre el comportamiento del contrato principal en el contexto de las dependencias reales y los datos que las dependencias 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, sean unitarias, simulaciones o pruebas de integración, se verán muy similares a la prueba anterior. Las pruebas harán cuatro cosas:

  1. Crea un entorno, el Env, ya sea con Env::default() o Env::from_ledger_snapshot_file(...).
  2. Registra el o los contratos a probar.
  3. Invoca funciones usando el cliente generado.
  4. Asegura 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 utilizando esa imagen para entender mejor por qué o cómo ocurrió una serie de eventos.

consejo

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