Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Corra programador, corra pra testar seu código

Corra programador, corra pra testar seu código

Não fique parada esperando o tempo passar e seu código vire uma bomba. Aprenda os princípios necessários à construção de testes e garantir a qualidade do seu software.

Osvaldo Matos Júnior

October 18, 2013
Tweet

More Decks by Osvaldo Matos Júnior

Other Decks in Technology

Transcript

  1. def test_soma(): x = y = 2 assert soma(x, y)

    == 4 def soma(x, y): return x*y
  2. Teste os Extremos Tamanho do login Inválido: usernamecomtamanhoinvalido Meses do

    ano Intervalo: 1 ≤ mes ≤ 12 Extremos: negativo, zero, 13 Ano de nascimento Extremos: passado distante e futuro
  3. Teste Condições Inesperadas Valor vazio ou nulo filtrar_por_ano("") ano =

    None filtrar_por_ano(ano) Tipos de dados inesperados filtrar_por_ano(2001.2) filtrar_por_ano("2001")
  4. class Document: def __init__(self, title, text): self.id = -1 self.title

    = title self.text = text class Storage: def __init__(self, db, formatter): self.db = db self.formatter = formatter def save(self, doc): try: self.formatter.format(doc) self.db.commit(doc) return True except: return False
  5. class DummyDB: obj = None def commit(self, obj): obj.id =

    random.randint(1, 10000) self.obj = obj class DummyFormatter: called = False def format(self, doc): self.called = True def test_storage_save(): db = DummyDB() formatter = DummyFormatter() storage = Storage(db, formatter) doc = Document("Title", "Text of the document") assert storage.save(doc) == True assert obj.id > 0 and db.obj != None assert formatter.called == True
  6. Testes de Unidade em Python unittest (xunit like) py.test doctest

    nose mock Mockito … https://wiki.python.org/moin/PythonTestingToolsTaxonomy
  7. import unittest def soma(a, b): return a + b class

    TestSoma(unittest.TestCase): def test_numbers_2_2(self): self.assertEqual( soma(2,2), 4) def test_numbers_1_3(self): self.assertEqual( soma(1,3), 4) if __name__ == '__main__': unittest.main()
  8. class SaldoInsuficiente(Exception): pass class ContaBancaria: def __init__(self, saldo=0): self.saldo =

    saldo def vazia(self): return self.saldo == 0 def deposito(self, valor): self.saldo += valor def saque(self, valor): if valor > self.saldo: raises SaldoInsuficiente("Saldo:%d"%self.saldo) self.saldo -= valor
  9. import unittest class ContaBancariaTest(unittest.TestCase): def test_conta_vazia(self): conta = ContaBancaria() self.asserTrue(conta.vazia())

    def test_deposito(self): conta = ContaBancaria(10) conta.deposito(10) self.assertEquals(conta.saldo, 20) def test_saque_acima_limite(self): conta = ContaBancaria(10) self.assertRaises(SaldoInsuficiente, conta.saque, 100) if __name__ == '__main__': unittest.main()
  10. Preparação dos Testes setUp() / tearDown() antes/depois de cada teste

    setUpClass() / tearDownClass() antes/depois de cada TestCase setUpModule / tearDownModule() antes/depois de cada módulo de teste
  11. def setUpModule(): print "setUpModule()" def tearDownModule(): print "tearDownModule()" class ContaBancariaTest(unittest.TestCase):

    @classmethod def setUpClass(cls): print "setUpClass()" @classmethod def tearDownClass(cls): print "tearDownClass()" def setUp(self): print "setUp()" def tearDown(self): print "tearDown()" def test_1(self): print "test_1()" def test_2(self): print "test_2()" def test_3(self): print "test_3()"
  12. $ python testes.py setUpModule() setUpClass() setUp() test_1() tearDown() setUp() test_2()

    tearDown() setUp() test_3() tearDown() tearDownClass() tearDownModule()
  13. import unittest import sqlite3 class FriendsDBTest(unittest.TestCase): def setUp(self): self.conn =

    sqlite3.connect(":memory:") with self.conn: cur = self.conn.cursor() cur.execute("CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT);") cur.execute("INSERT INTO Friends(Name) VALUES ('Tom');") cur.execute("INSERT INTO Friends(Name) VALUES ('Rebecca');") def tearDown(self): self.conn.close() def test_using_db_connection(self): pass
  14. Using Mocks from mock import Mock class StorageTest(unittest.TestCase): def test_save_success(self):

    db = Mock() formatter = Mock() storage = Storage(db, formatter) doc = Document("Title", "Text of the document") self.assertTrue(storage.save(doc)) self.assertTrue(formatter.called) self.assertEqual(formatter.call_count, 1) db.commit.assert_called_once_with(doc)
  15. Using Mocks from mock import Mock class StorageTest(unittest.TestCase): def test_formatter_error(self):

    db = Mock() formatter = Mock() formatter.format.side_effect = Exception storage = Storage(db, formatter) doc = Document("Title", "Text of the document") self.assertRaises(Exception, storage.save, doc) self.assertFalse(db.called) formatter.format.assert_called_once_with(doc)
  16. São os testes de unidade que mantêm seus códigos flexíveis,

    reutilizáveis e passíveis de manutenção. (Clean Code)
  17. Test-driven Development (TDD) Primeira Lei Não se deve escrever o

    código de produção até criar um teste de unidade de falhas. Segunda Lei Não se deve escrever mais de um teste de unidade do que o necessário para falhar, e não compilar é falhar. Terceira Lei Não se deve escrever mais códigos de produção que o necessário para aplicar o teste de falha atual.
  18. Test-driven Development (TDD) Primeira Lei Não se deve escrever o

    código de produção até criar um teste de unidade de falhas. Segunda Lei Não se deve escrever mais de um teste de unidade do que o necessário para falhar, e não compilar é falhar. Terceira Lei Não se deve escrever mais códigos de produção que o necessário para aplicar o teste de falha atual.
  19. Test-driven Development (TDD) Primeira Lei Não se deve escrever o

    código de produção até criar um teste de unidade de falhas. Segunda Lei Não se deve escrever mais de um teste de unidade do que o necessário para falhar, e não compilar é falhar. Terceira Lei Não se deve escrever mais códigos de produção que o necessário para aplicar o teste de falha atual.
  20. from boto.s3.connection import S3Connection class S3TestIntegrationTest( unittest.TestCase): def setUp(self): self.bucket_name

    = "test_bucket" self.conn = S3Connection('<aws access key>', '<aws secret key>') def tearDown(self): self.conn.close() def test_create_bucket(self): bucket = self.conn.create_bucket(self.bucket_name) self.assertIsNotNone(bucket) def test_delete_bucket(self): self.conn.delete_bucket(self.bucket_name) self.assertIsNone(self.conn.lookup(self.bucket_name))
  21. Testes de Aceitação User Acceptance Tests (UAT) or End-user testing

    - Foco no comportamento do usuário final Behavior-driven Development (BDD) - Outside-in
  22. User Story Story: Returns go to stock In order to

    keep track of stock As a store owner I want to add items back to stock when they're returned Scenario 1: Refunded items should be returned to stock Given a customer previously bought a black sweater from me And I currently have three black sweaters left in stock When he returns the sweater for a refund Then I should have four black sweaters in stock Scenario 2: Replaced items should be returned to stock Given that a customer buys a blue garment And I have two blue garments in stock And three black garments in stock. When he returns the garment for a replacement in black, Then I should have three blue garments in stock And two black garments in stock
  23. Pyccuracy As a Google User I want to search Google

    So that I can test Pyccuracy Scenario 1 - Searching for Hello World Given I go to "http://www.google.com" When I fill "q" textbox with "Hello World" And I click "btnG" button and wait Then I see "Hello World - Google Search" title
  24. Splinter from splinter import Browser def test_appears_on_google_search(self): with Browser() as

    browser: browser.visit('http://google.com') browser.fill('q', 'splinter webtesting') button = browser.find_by_name('btnG') button.click() self.assertTrue(browser.is_text_present( 'splinter.cobrateam.info'))
  25. PyFunct from pyfunct import FunctTestCase class MyTestCase(FunctTestCase): def test_searching_a_wiki(self): self.browser.open_page('wikipedia

    index') self.browser.type('search input', 'Functional testing') self.browser.click_and_wait('search button') page_title = self.browser.page_title expected_title = 'Functional testing - Wikipedia, the free encyclopedia' self.actions.assert_title_contains(self.browser, expected_title)