{"id":1031,"date":"2020-08-04T12:20:30","date_gmt":"2020-08-04T15:20:30","guid":{"rendered":"https:\/\/micheladrianomedeiros.com.br\/blog\/?p=1031"},"modified":"2020-08-04T12:20:32","modified_gmt":"2020-08-04T15:20:32","slug":"tdd-com-python-4","status":"publish","type":"post","link":"https:\/\/micheladrianomedeiros.com.br\/blog\/tdd-com-python-4\/","title":{"rendered":"TDD com Python #4"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\"><strong>O M\u00f3dulo da Unidade de Teste da Biblioteca Padr\u00e3o do Python<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e1 alguns problemas que devemos lidar. Primeiro, a mensagem \u201cAssertionError\u201d n\u00e3o ajuda muito, seria legal se o teste nos dissesse o que encontrou e colocasse como t\u00edtulo no browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para isso poder\u00edamos fazer dessa maneira:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">assert \u2018To-Do\u2019 in browser.title, \u201cT\u00edtulo do Browser \u201c + browser.title<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos utilizar um try\/finally para limpar a janela do Firefox. Mas essas organiza\u00e7\u00f5es de problemas s\u00e3o testes comuns, e h\u00e1 algumas solu\u00e7\u00f5es para nossos m\u00f3dulos de teste unit\u00e1rio para nossa biblioteca. Vamos testar isso:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:python decode:true \" >from selenium import webdriver\nimport unittest\n\nclass NewVisitorTest(unittest.TestCase):  #1\n\n    def setUp(self):  #2\n        self.browser = webdriver.Firefox()\n\n    def tearDown(self):  #3\n        self.browser.quit()\n\n    def test_can_start_a_list_and_retrieve_it_later(self):  #4\n        #Edith ouviu falar de um novo aplicativo de tarefas online to-do app.\n        #Ela vai checar a homepage\n        self.browser.get('http:\/\/localhost:8000')\n\n        #Ela nota que o t\u00edtulo e cabe\u00e7alho da p\u00e1gina menciona uma list to-do\n        self.assertIn('To-Do', self.browser.title)  #5\n        self.fail('Terminou o teste!')  #6\n\n        #Ela \u00e9 convidada a adicionar um item no to-do\n      #  [...rest of comments as before]\n\nif __name__ == '__main__':  #7\n    unittest.main(warnings='ignore')  #8<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">#1 &#8211; Testes s\u00e3o organizados dentro de classes, o qual herda do unittest.TestCase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#2 &#8211; O corpo principal do teste \u00e9 um m\u00e9todo chamado test_can_start_a_list_and_retrieve_it_later. Quaisquer m\u00e9todos que tenha nomes que comecem com test \u00e9 um m\u00e9todo de teste, e ser\u00e3o executados como testes. Voc\u00ea pode ter mais de um m\u00e9todo de teste por classe. Nomes relativos ao teste \u00e9 uma boa pr\u00e1tica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#3 &#8211; setUp e tearDown s\u00e3o m\u00e9todos especiais os quais executa antes e depois de cada teste. Eu estou utilizando a abertura e encerramento do nosso browser, note que eles s\u00e3o um pouco parecidos com um try\/except, o tearDown executar\u00e1 mesmo que ocorra um erro durante o teste. Sendo assim uma janela com erro n\u00e3o ficar\u00e1 aberta esperando voc\u00ea fechar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#4 &#8211; N\u00f3s utilizamos o self.assertIn ao inv\u00e9s de apenas assert para nosso teste de asser\u00e7\u00e3o. Teste unit\u00e1rio fornece muitas funcionalidades como fazer testes de asser\u00e7\u00f5es, como assertEqual, assertTrue, assertFalse e assim por diante. Veja a documenta\u00e7\u00e3o <a href=\"https:\/\/docs.python.org\/3\/library\/unittest.html\">https:\/\/docs.python.org\/3\/library\/unittest.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#5 \u2013 self.fail \u00e9 apenas uma mensagem de erro. Estou utilizando para mostrar a mensagem de \u201cTerminou o teste!\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#6 &#8211; Finalmente, n\u00f3s temos o if __name__ == \u2018__main__\u2019 \u00e9 assim que inicia um script. Chamamos o unittest.main(), &nbsp;o qual lan\u00e7a o unittest, o qual ir\u00e1 automaticamente encontrar classes de testes e m\u00e9todos no arquivo e execut\u00e1-lo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#7 \u2013 warnings=\u2019ignore\u2019 n\u00e3o mostra avisos sem import\u00e2ncia, ResourceWarning o qual apresenta no console de execu\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea leu a documenta\u00e7\u00e3o do Django, voc\u00ea deve ter visto algo chamado LiveServerTestCase, e est\u00e1 pensando se devemos utiliz\u00e1-lo agora. Utilizar o LiveServerTestCase \u00e9 um pouco mais complicado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos executar o teste que criamos.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"318\" src=\"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2020\/08\/image.png\" alt=\"\" class=\"wp-image-1032\" srcset=\"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2020\/08\/image.png 567w, https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2020\/08\/image-300x168.png 300w, https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2020\/08\/image-262x147.png 262w, https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2020\/08\/image-260x147.png 260w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Melhorou um pouco. Agora a janela do Firefox fecha caso haja algum erro e no console temos mais informa\u00e7\u00f5es do que foi testado e o erros encontrados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fonte: <strong>Tdd com Python: Siga o Bode dos Testes: Usando Django, Selenium e JavaScript<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O M\u00f3dulo da Unidade de Teste da Biblioteca Padr\u00e3o do Python H\u00e1 alguns problemas que devemos lidar. Primeiro, a mensagem \u201cAssertionError\u201d n\u00e3o ajuda muito, seria legal se o teste nos dissesse o que encontrou e colocasse como t\u00edtulo no browser. Para isso poder\u00edamos fazer dessa maneira: assert \u2018To-Do\u2019 in browser.title, \u201cT\u00edtulo do Browser \u201c + [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":210,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[],"class_list":["post-1031","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tdd"],"_links":{"self":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts\/1031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1031"}],"version-history":[{"count":1,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts\/1031\/revisions"}],"predecessor-version":[{"id":1033,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts\/1031\/revisions\/1033"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/media\/210"}],"wp:attachment":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}