Pular para o conteúdo

Testes de integração

O banco de verdade, a rota inteira — e onde termina a unidade.

O teste unitário prova que cada peça funciona. O de integração prova que elas se encaixam: o SQL que a regra monta é aceito pelo banco, a rota traduz o JSON que o cliente manda. É o teste que pega o erro que só existe entre duas peças.

Com o banco de verdade#

dataforge
adopt Arcane.Crucible
adopt Arcane.Database as DB

action criar_esquema(db):
    DB.execute(db, "CREATE TABLE contas (id INTEGER PRIMARY KEY, dono TEXT UNIQUE, saldo REAL CHECK (saldo >= 0))")

action abrir(db, dono):
    DB.execute(db, "INSERT INTO contas (dono, saldo) VALUES (?, 0)", [dono])

action depositar(db, dono, valor):
    DB.execute(db, "UPDATE contas SET saldo = saldo + ? WHERE dono = ?", [valor, dono])

action saldo(db, dono):
    yield DB.query(db, "SELECT saldo FROM contas WHERE dono = ?", [dono])[0]["saldo"]

crucible "contas no banco":
    trial "deposito aparece no saldo":
        db := DB.memory()
        criar_esquema(db)
        abrir(db, "ana")
        depositar(db, "ana", 50)
        expect saldo(db, "ana") is 50.0

    trial "o banco recusa dono repetido":
        db := DB.memory()
        criar_esquema(db)
        abrir(db, "ana")
        expect(lambda => abrir(db, "ana")).to_raise()

    trial "o CHECK do banco segura o saldo negativo":
        db := DB.memory()
        criar_esquema(db)
        abrir(db, "bia")
        expect(lambda => depositar(db, "bia", -10)).to_raise()

r := Crucible.run()
assert r["falhou"] is 0 and r["passou"] is 3

Com a rota inteira#

dataforge
adopt Kiln
adopt Arcane.Crucible

server api on 0:
    route POST "/somar":
        given not is_number(body["a"] ?? void) or not is_number(body["b"] ?? void):
            respond 400 json {"erro": "a e b precisam ser numeros"}
        respond json {"resultado": body["a"] + body["b"]}

crucible "rota /somar":
    trial "soma o que chega":
        r := Kiln.test(api, "POST", "/somar", {"a": 2, "b": 3})
        expect r["status"] is 200
        expect r["body"]["resultado"] is 5

    trial "texto no lugar de numero e 400, e nao 500":
        expect Kiln.test(api, "POST", "/somar", {"a": "2", "b": 3})["status"] is 400

r := Crucible.run()
assert r["falhou"] is 0

Onde termina a unidade#

UnitárioIntegraçãoPonta a ponta
a regra, sem bancoa regra com o bancoo sistema subido
milissegundosdezenas de mssegundos
centenasdezenaspoucos
diz qual peçadiz qual encaixediz que algo quebrou

Continue em Ponta a ponta e A pirâmide.