1. Declara el contexto
El contexto agrupa habilitación, contadores y diagnóstico. Declara uno por caso para evitar que una prueba contamine a otra:
PROGRAM TestRunner VAR TestEquals : ST_TestCaseContext; Expected : INT := 10; Actual : INT := 10; END_VAR
2. Ejecuta una aserción
Conecta el contexto completo mediante Context :=. El runner activará el caso antes del ciclo PLC:
IF TestEquals.Enabled THEN AssertEqualsINT( Expected := Expected, Actual := Actual, Context := TestEquals ); END_IF;
El contador, las aprobadas, las fallidas y el diagnóstico quedan en TestEquals.
3. Aserciones para señales PLC
Para valores analógicos usa tolerancia absoluta; para registros usa máscaras; para lógica secuencial usa una aserción con límite de scans:
AssertNearREAL(Expected := 2.5, Actual := Sensor, Tolerance := 0.05, Context := TestAnalog);
AssertBitSetWORD(Value := StatusWord, Mask := 16#0004, Context := TestBits);
AssertEventually(Condition := MotorRunning, TimeoutScans := 20, Context := TestSequence);
FB_AssertEventually cuenta una sola aserción y conserva su estado entre scans; ejecuta el runner con --cycles suficiente para cubrir la ventana temporal.
4. Registra el caso
El manifiesto externo da estabilidad al nombre del caso y permite filtrarlo sin cambiar el código ST:
{
"id": "equals_int",
"name": "INT equality",
"prefix": "TestEquals",
"tags": ["smoke", "int"]
}Buenas prácticas
- Un caso debe explicar una sola expectativa observable.
- Usa tags estables como smoke, diagnostic u ordering.
- Mantén los datos de entrada explícitos y evita depender del estado de otro caso.
- Para suites multi-scan, protege las aserciones que solo deban ejecutarse una vez.