oracle0.6.0

paso a paso · con la salida real

Una medida,
de cero

Nueve pasos hasta un proyecto verde. Al final son 60 líneas, y dos de las cosas que vas a ver son la herramienta corrigiéndote.

Todo lo que sigue es la salida textual de correr esto con 0.6.0.

1

Instalar

$ uv tool install oracle-metalenguaje $ oracle --version oracle 0.6.0 álgebra: 0.6 (qué SIGNIFICA una medida) sintaxis: 0.2 (cómo se ESCRIBE)

Cero dependencias. Son dos versiones distintas a propósito: lo que una medida significa no envejece igual que cómo se escribe.

2

Crear el proyecto

$ oracle proyecto init Proyecto Oracle inicializado: · catalogos/ · corpus/ · diferencial/ · oracle.json

Desde este momento 34 medidas ya te obligan. Vienen del catálogo base y juzgan cómo escribís las tuyas: que declaren su umbral, de dónde salió el número, y qué no miran. No son 57 —ése es el catálogo entero— porque 20 sólo obligan a Oracle y no viajan a tu proyecto.

3

El caso, antes
que la medida

Es el orden que importa y el que cuesta respetar. Si la medida se escribe primero, el caso termina diciendo lo que la medida ya hace: no la prueba, la describe.

El defecto de este ejemplo es el problema del lazo cerrado en miniatura: una prueba que pasó sin afirmar nada. Pasa igual con la función borrada.

$ oracle caso nuevo pruebas/001-paso-sin-afirmar caso 001-paso-sin-afirmar: procedencia: construida etiqueta: falso_verde sintoma: La suite reportó 3 de 3 en verde. Una no tenía ninguna aserción: se llamó a la función y nadie comparó el resultado. como_se_detecto: persona medida: pruebas.ninguna_pasa_sin_afirmar evidencia: prueba: nombre, aserciones, paso "suma_dos_positivos", 2, true "suma_con_cero", 1, true "suma_negativos", 0, true

La medida que el caso reclama todavía no existe, y está bien: el caso describe el defecto, no la regla.

4

Ahora sí, la medida

$ oracle nueva pruebas.ninguna_pasa_sin_afirmar ninguno pruebas.ninguna_pasa_sin_afirmar: de prueba p donde p.paso == true y p.aserciones == 0 umbral <= 0 segun contrato porque "una prueba sin aserciones pasa con la funcion borrada: no distingue el codigo que mide del que no existe, asi que su verde no es evidencia de nada" ambito universal alcance "cuenta pruebas que pasaron con cero aserciones. NO ve si las aserciones que hay comprueban lo correcto, ni si la prueba cubre el caso que importa, ni una asercion siempre verdadera"

El donde selecciona lo que ofende, no lo que está bien. Y el alcance es obligatorio: sin él, un verde se lee como «está todo bien», y ninguna medida ve todo.

5

La herramienta
te corrige

$ oracle revisar catalogos/pruebas/pruebas.ninguna_pasa_sin_afirmar.oracle ✓ bien declarada (forma: ninguno) contra la evidencia que hay: 0 verde · 1 rojo · 0 error se pone roja con «001-paso-sin-afirmar»: ✗ pruebas.ninguna_pasa_sin_afirmar 1 (<= 0) → p=suma_negativos ⚠ nunca se pone verde. Probablemente la condición esté invertida: el `donde` tiene que seleccionar lo que OFENDE, no lo que está bien.

La medida está bien: lo que falta es un caso verde. Sin él nadie comprobó que la medida sepa no dispararse — y una regla que siempre da rojo tampoco mide.

6

El caso verde,
que no sobra

caso 002-todas-afirman: procedencia: observada etiqueta: verde_correcto sintoma: Ninguno. Es la salida real de `pytest -q` sobre el repo de ejemplo, con el conteo de aserciones de cada prueba. como_se_detecto: observacion evidencia: prueba: nombre, aserciones, paso "suma_dos_positivos", 2, true "suma_con_cero", 1, true "resta_sin_implementar", 0, false

La tercera fila tiene cero aserciones y no ofende: falló, y eso ya se ve. Lo que la medida persigue es el par «pasó y no afirmó».

7

El catálogo base
te pone en rojo

$ oracle test ACEPTACIÓN ✗ — 2 problema(s) · meta.la_medida_no_se_fija_solo_con_evidencia_fabricada → casos: 2, no_observados: 2 · meta.toda_cantidad_comparada_tiene_unidad_derivable → unidad: 'sin_declarar', es_derivable: False mutantes de medida: 11 · murieron 11 · sobrevivieron 0 VEREDICTO: ROJO (falló: aceptación)

La mutación ya está en cero: los dos casos fijan la medida. Lo que falta es lo que el catálogo base exige de cualquiera — que al menos un caso venga de una corrida real, y que la cantidad que comparás tenga unidad declarada.

8

Declarar de qué
están hechos los hechos

$ cat relaciones/prueba.json ["relacion", "prueba", ["campos", ["campo", "nombre", "texto", "sin_unidad"], ["campo", "aserciones", "entero", "aserciones"], ["campo", "paso", "booleano", "sin_unidad"]], ["alcance", "lee lo que el runner reportó de cada prueba. NO ve qué comprueba cada aserción, ni si la prueba cubre el caso que importa"]]

Comparar p.aserciones == 0 sin decir que se miden aserciones es comparar un número con otro número. La relación también declara su punto ciego: el sensor tampoco ve todo.

9

Verde

$ oracle test ACEPTACIÓN ✓ — 1 defectos en rojo, 1 verdes correctos, 0 huecos declarados sin tapar mutantes de medida: 11 · murieron 11 · sobrevivieron 0 detecciones evaluadas (mutante × caso): 22 ✓ meta.toda_medida_esta_ejercitada 0 (<= 0) ✓ meta.toda_medida_esta_fijada 0 (<= 0) VEREDICTO: VERDE (todas las verificaciones aplicables en regla)
catalogos/pruebas/pruebas.ninguna_pasa_sin_afirmar.oracle corpus/pruebas/001-paso-sin-afirmar.caso corpus/pruebas/002-todas-afirman.caso relaciones/prueba.json oracle.json 60 líneas en total

lo que este verde sí dice

Y lo que no

Dice que hay una regla escrita, que un defecto real la pone en rojo, que un caso sano la deja en verde, y que los once mutantes de esa regla mueren contra esos dos casos: no se puede reescribir la medida de otra forma sin que el corpus lo note.

No dice que tus pruebas estén bien. La medida cuenta aserciones; una aserción que siempre es verdadera cuenta igual que una que discrimina. Eso está escrito en su alcance, y es lo primero que hay que leer de una medida que no escribiste.

El siguiente paso real no es escribir más medidas: es conectar el sensor. Mientras la evidencia se escriba a mano, esto prueba que el catálogo es coherente — no que tu proyecto esté bien.