Testes parametrizados
Uma tabela de casos, um corpo só — e o caso que falhou aparece pelo nome.
Quando dez testes têm o mesmo corpo e mudam só os dados, eles são uma tabela. Crucible.table roda um trial por linha: o corpo é escrito uma vez, e a falha diz qual linha quebrou.
dataforge
adopt Arcane.Crucible
action categoria(idade):
given idade smaller 0:
trigger "idade negativa"
given idade smaller 12:
yield "crianca"
given idade smaller 18:
yield "adolescente"
given idade smaller 60:
yield "adulto"
yield "idoso"
crucible "categoria por idade":
Crucible.table("limites", [
{"idade": 0, "esperado": "crianca"},
{"idade": 11, "esperado": "crianca"},
{"idade": 12, "esperado": "adolescente"},
{"idade": 17, "esperado": "adolescente"},
{"idade": 18, "esperado": "adulto"},
{"idade": 59, "esperado": "adulto"},
{"idade": 60, "esperado": "idoso"}
], lambda caso: Crucible.expect(categoria(caso["idade"])).to_be(caso["esperado"]))
trial "idade negativa e recusada":
expect(lambda => categoria(-1)).to_raise()
r := Crucible.run()
assert r["falhou"] is 0
assert r["passou"] is 8Quando usar tabela, e quando não#
| Tabela | Trials separados |
|---|---|
| o corpo é o mesmo e só os dados mudam | cada caso confere uma coisa diferente |
| os limites de uma regra | caminhos diferentes (sucesso, erro, vazio) |
| a tabela da lei, linha por linha | o caso precisa de preparo próprio |
Para milhares de entradas geradas, e não uma tabela escrita: Teste por propriedade.