Você está na página 1de 30

Testes generativos

@luiz_hespanha

luiz.hespanha@nubank.com.br

Desenvolvedor de Software @nubankbrasil


Motivao

Testes automatizados.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 2


Testes automatizados

Garantir regresso rapidamente.

Garantir que o que est entrando


novo funciona.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 3


Testes automatizados

Testes unitrios (lgica)


Testes de integrao dentro de um
servio (BD, Kafka, etc).
Testes e2e (Integrao entre os
servios)
Nu Minimal Keynote Template Nu Bank - 05.01.2014 4
Disclaimer

Cdigo Clojure nos prximos slides.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 5


Testes baseados em exemplos

(= a b)

Nu Minimal Keynote Template Nu Bank - 05.01.2014 6


Testes baseados em exemplos

(= [5 2 1] (reverse [1 2 5])
(= [1 2 3 4 5] (reverse [5 4 3 2 1])
(= [5] (reverse [5])
(= [] (reverse [])
(= ["c" "b" "a"] (reverse ["a" "b" "c"]))

Nu Minimal Keynote Template Nu Bank - 05.01.2014 7


Testes automatizados

Nossos testes esto limitados a nossa


imaginao.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 8


Testes automatizados

Como podemos melhorar os nossos


testes?

Nu Minimal Keynote Template Nu Bank - 05.01.2014 9


color
blank

Testes generativos

Nu Minimal Keynote Template Nu Bank - 05.01.2014 10


Testes generativos

Pensar em propriedades

Nu Minimal Keynote Template Nu Bank - 05.01.2014 11


O que so propriedades?

Constraints" e invariantes" que so


verdade *sempre*.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 12


Um pouco mais formal

Property-based testing encourages a high level approach to testing in


the form of abstract invariants functions should satisfy universally,
with the actual test data generated for the programmer by the
testing library. In this way code can be hammered with thousands of
tests that would be infeasible to write by hand, often uncovering subtle
corner cases that wouldnt be found otherwise.

Real World Haskell by Bryan OSullivan, Don Stewart & John Goerzen

Nu Minimal Keynote Template Nu Bank - 05.01.2014 13


Testes generativos

(prop/for-all
[a (gen/vector gen/any)
[b (gen/vector gen/any)]
(= (count (concat a b))
(+ (count a) (count b))))]

Nu Minimal Keynote Template Nu Bank - 05.01.2014 14


Testes generativos

(tc/quick-check 1000 my-property)


;; => {:result true
;; :num-tests 1000
;; :seed 1395119077}

Nu Minimal Keynote Template Nu Bank - 05.01.2014 15


color
blank

Ser que acha bugs mesmo?

Nu Minimal Keynote Template Nu Bank - 05.01.2014 16


Testes generativos

(-> #{} (conj 109) (conj -110)


transient (disj! -110)
persistent! (conj -110)

Nu Minimal Keynote Template Nu Bank - 05.01.2014 17


Testes generativos

(def transient-property
(prop/for-all
[a (gen/vector gen-action)]
(= (apply-actions #{} a)
(apply-actions #{} (filter-transients a)))))

Nu Minimal Keynote Template Nu Bank - 05.01.2014 18


Testes generativos

(tc/quick-check 100000 transient-property)

Nu Minimal Keynote Template Nu Bank - 05.01.2014 19


Fail

{:result false,
:failing-size 92,
:num-tests 2893,
:fail "...",
:shrunk
{:total-nodes-visited 440
:depth 83
:result false
:smallest "..."}}

Nu Minimal Keynote Template Nu Bank - 05.01.2014 20


Generators

Generators
(prop/for-all
[a (gen/vector gen/any)
b (gen/vector gen/any)]
(= (count (concat a b))
(+ (count a) (count b))))

Nu Minimal Keynote Template Nu Bank - 05.01.2014 21


Generators

any any-printable boolean byte bytes char


char-alpha-numeric char-ascii hash-map int keyword
list map nat neg-int pos-int ratio s-neg-int s-posint
string string-alpha-numeric string-ascii tuple
vector

Nu Minimal Keynote Template Nu Bank - 05.01.2014 22


Generators

podemos criar os nossos prprios


geradores.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 23


Generators

(prop/for-all
[p (gen/vector gen/purchases)]
(= (:total-value (close-bill p))
(sum-purchases p)))

Nu Minimal Keynote Template Nu Bank - 05.01.2014 24


Fluxo de trabalho com testes generativos

Sempre que o teste generativo


encontrar um bug, escrever um teste
unitrio com o exemplo que falhou.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 25


Fluxo de trabalho com testes generativos

Durante o desenvolvimento deixar o


nmero de testes alto, e diminuir
quando fizer o merge" no master".

Nu Minimal Keynote Template Nu Bank - 05.01.2014 26


Testes generativos

Onde estamos usando no Nubank:


Sistema de contabilidade interno.
Criao de nmeros de carto de
crdito.
Integrao com terceiros via
protocolos de baixo nvel.
Nu Minimal Keynote Template Nu Bank - 05.01.2014 27
Ferramentas

Clojure -> https://github.com/clojure/test.check


Scala -> http://www.scalatest.org/user_guide/property_based_testing
Java -> https://github.com/pholser/junit-quickcheck
Haskell -> https://hackage.haskell.org/package/QuickCheck

provavelmente tem framework para outras linguagens tambm.


de qualquer forma, os seus testes no precisam usar a mesma linguagem da sua
aplicao.

Nu Minimal Keynote Template Nu Bank - 05.01.2014 28


Concluso

Testes generativos
so complementares
aos seus testes
baseados em
exemplos, e ajudam
a melhorar a
confiabilidade dos
seus testes.
Nu Minimal Keynote Template Nu Bank - 05.01.2014 29
full page
photo

Obrigado!

Nu Minimal Keynote Template Nu Bank - 05.01.2014 30