{"id":631,"date":"2017-04-26T18:00:00","date_gmt":"2017-04-26T18:00:00","guid":{"rendered":"https:\/\/geoadmin.com.br\/?p=631"},"modified":"2021-06-09T10:25:23","modified_gmt":"2021-06-09T13:25:23","slug":"como-escrever-bons-relatorios-de-bugs","status":"publish","type":"post","link":"https:\/\/geoadmin.com.br\/?p=631","title":{"rendered":"Como escrever bons relat\u00f3rios de bugs"},"content":{"rendered":"<p>Escrever software \u00e9 dificil. Manter um software atualizado e em funcionamento<br \/>\nsem defeitos, \u00e9  ainda mais dificil.<\/p>\n<p>Uma das ferramentas mais importantes para que isso ocorra, isto \u00e9, a cria\u00e7\u00e3o<br \/>\ne manuten\u00e7\u00e3o de um bom software, com o m\u00ednimo de defeitos (nenhum software \u00e9 perfeito), \u00e9 sem d\u00favida, os relat\u00f3rios de<br \/>\ndefeitos, ou <em>bug reports<\/em>.<\/p>\n<p>Eles podem ser criados por qualquer pessoa que use de fato o software, qualquer<br \/>\nque ele seja. Alguns relat\u00f3rios de bugs (chamaremos apenas de bugs, daqui por)<br \/>\ndiante ser\u00e3o escritos por desenvolvedores, que notar\u00e3o comportamentos estranhos<br \/>\nainda na etapa de desenvolvimento. Outros ser\u00e3o escritos por testadores profissionais,<br \/>\nque ganham o p\u00e3o procurando a desgra\u00e7a alheia. E outros bugs, ser\u00e3o encontrados<br \/>\napenas quando o nosso software estiver em produ\u00e7\u00e3o &#8211; pelo usu\u00e1rio final.<\/p>\n<p>N\u00e3o importando quem escreveu, todo e qualquer bug merece um relat\u00f3rio e uma<br \/>\ninvestiga\u00e7\u00e3o formal. O quanto antes, melhor. Bugs tendem a ficar cada vez mais<br \/>\ncaros, conforme o tempo passa. Estima-se que um bug descoberto em produ\u00e7\u00e3o custa 10 vezes mais o valor do que  se ele tivesse sido encontrado antes &#8211; durante o desenvolvimento.<\/p>\n<p>A conta \u00e9 simples: se o bug tivesse sido encontrado durante a etapa de desenvolvimento, o desenvolvedor gastaria 2 horas para resolv\u00ea-lo e adicionar<br \/>\num teste de unidade, afim de garantir que o mesmo n\u00e3o retorne para assombrar ningu\u00e9m,<br \/>\nanos depois.<\/p>\n<p>Se o bug \u00e9 encontrado em produ\u00e7\u00e3o, ser\u00e3o gastos, aproximadamente, 20 horas para<br \/>\nresolv\u00ea-lo. Sen\u00e3o mais. Tudo em produ\u00e7\u00e3o \u00e9 mais dif\u00edcil.<\/p>\n<p>Certo, bugs s\u00e3o caros, mas e da\u00ed? Bem, se podemos resolver o bug em desenvolvimento<br \/>\ne uma das principais formas de se resolver um bug \u00e9 criando um <em>bug report<\/em>,<br \/>\nbons relat\u00f3rios de bugs facilitam a vida dos desenvolvedores, na hora de encontrar<br \/>\no danado e resolv\u00ea-lo de uma vez por todas.<\/p>\n<p>Maus relat\u00f3rios de bugs deixar\u00e3o os desenvolvedores <strong>e<\/strong> usu\u00e1rios irritados. Bugs<br \/>\ncom t\u00edtulos e descri\u00e7\u00f5es inadequadas ser\u00e3o muito mais dif\u00edceis de serem resolvidos,<br \/>\npois s\u00e3o mais dif\u00edceis de serem encontrados, terem o comportamento exato reproduzido,<br \/>\nassim por diante.<\/p>\n<p>Uma m\u00e1xima importante \u00e9:<\/p>\n<blockquote><p>\n  Um bom relat\u00f3rio de bug descreve o problema de forma que o desenvolvedor familiarizado com o projeto pode entender e resolv\u00ea-lo, <strong>sem falar com a pessoa que o escreveu<\/strong>.\n<\/p><\/blockquote>\n<p>Esta \u00e9 uma tradu\u00e7\u00e3o generalizada de uma [postagem do martiancraft][martincraft-bug-report]. Realmente, devo concordar com o t\u00edtulo.<\/p>\n<p>Pequena est\u00f3ria: uma certa vez, trabalhando com um cliente &#8211; sem expertise t\u00e9cnica, decidiu que gostaria de escrever seus pr\u00f3prios relat\u00f3rios de bugs. \u00d3timo, pensei, uma coisa a menos que terei de fazer. Este cliente nunca havia utilizado ou mesmo visto um relat\u00f3rio de bug.<\/p>\n<p>Quando ele come\u00e7ou a escrev\u00ea-los, ele colocava t\u00edtulos estranhos, descri\u00e7\u00f5es que n\u00e3o mencionavam como reproduzir o mesmo e tentava explicar problemas de desenho da tela, utilizando palavras &#8211; sem um simples <em>screenshot<\/em> se quer. Tudo bem, pensei, ele apenas precisa aprender a escrever melhores relat\u00f3rios de erros e nossa vida ser\u00e1 muito mais f\u00e1cil. Enviei alguns links para ele e a situa\u00e7\u00e3o melhorou.<\/p>\n<p>Os bugs eram corrigidos mais rapidamente, pois gast\u00e1vamos menos tempo tentando entender o que ele quis dizer com aquilo. Facilitou a comunica\u00e7\u00e3o sobre outras funcionalidades que ele queria para seu produto. Entre diversas outras coisas.<\/p>\n<p>Ent\u00e3o, confiem em mim: um <strong>bom<\/strong> relat\u00f3rio de erros \u00e9 essencial para a vida do desenvolvedor e do maior interessado, <strong>o cliente<\/strong>.<\/p>\n<p>Ent\u00e3o, o que todo bom relat\u00f3rio de bugs deve conter?<\/p>\n<h2>Apenas um problema por relat\u00f3rio<\/h2>\n<p><strong>Apenas um problema por relat\u00f3rio de defeito<\/strong>. Apenas. Um. Problema. Por. Relat\u00f3rio.<\/p>\n<p>N\u00e3o existe forma de deixar isto mais claro. Quando voc\u00ea tem um ou mais defeitos em um mesmo relat\u00f3rio de bugs, isto confunde o desenvolvedor, dificulta a corre\u00e7\u00e3o e dificulta principalmente o teste da corre\u00e7\u00e3o.<\/p>\n<p>Outra: os dois problemas andam juntos, s\u00e3o corrigidos juntos e aprovados juntos. Em uma equipe, estes problemas poderiam ter sido resolvidos em paralelo, fechados com <em>timelines<\/em> distintas (um bug era f\u00e1cil, o outro dif\u00edcil) e com maior qualidade.<\/p>\n<p><strong>Nunca reporte mais de um bug em um \u00fanico relat\u00f3rio. Nunca<\/strong>. Mesmo se eles forem relacionados. Cada bug \u00e9 importante o suficiente para merecer seu pr\u00f3prio relat\u00f3rio.<\/p>\n<h2>T\u00edtulo e Descri\u00e7\u00e3o<\/h2>\n<p>Um <strong>bom t\u00edtulo<\/strong> \u00e9 essencial para avalia\u00e7\u00e3o r\u00e1pida do problema. T\u00edtulos que n\u00e3o esclarem a situa\u00e7\u00e3o, ou mascaram o problema real, s\u00e3o as formas erradas de come\u00e7ar a escrever um relat\u00f3rio de erros.<\/p>\n<p>Um bom t\u00edtulo ajuda o desenvolvedor a realizar a triagem do bug, algo como: &#8220;ah \u00e9 s\u00f3 um texto na tela&#8221;, &#8220;faltou uma valida\u00e7\u00e3o aqui e ali&#8221; e &#8220;rapaz&#8230;tenho menor ideia do que diabos \u00e9 isso&#8221;. N\u00e3o s\u00f3 ajuda a identificar a criticidade do bug, mas tamb\u00e9m mais ou menos de onde vem o problema, facilitando a delega\u00e7\u00e3o da resolu\u00e7\u00e3o para um ou outro desenvolvedor ou time.<\/p>\n<p>J\u00e1 as descri\u00e7\u00f5es s\u00e3o os lugares para se dar detalhes sobre o bug. Contexto, informa\u00e7\u00f5es do ambiente, passos para reprodu\u00e7\u00e3o do bug, <strong>dados para reprodu\u00e7\u00e3o do bug<\/strong>, temperatura do ar, press\u00e3o atmosf\u00e9rica e humor do chefe no dia.<\/p>\n<p>Sem essas informa\u00e7\u00f5es cruciais, fica muito mais dif\u00edcil reproduzir o bug, tornando o mais caro para a empresa e para o cliente.<\/p>\n<p>Exemplos:<\/p>\n<ul>\n<li><strong>RUIM<\/strong>: &#8220;A aplica\u00e7\u00e3o n\u00e3o responde&#8221;;<\/li>\n<li><strong>BOM<\/strong>: &#8220;A aplica\u00e7\u00e3o n\u00e3o responde ap\u00f3s a carga do arquivo XPTO na tela FOO&#8221;;<\/p>\n<\/li>\n<li>\n<p><strong>RUIM<\/strong>: &#8220;Texto fora do padr\u00e3o&#8221;;<\/p>\n<\/li>\n<li>\n<p><strong>BOM<\/strong>: &#8220;Texto do t\u00edtulo &#8216;Pesquisa&#8217; est\u00e1 desformatado&#8221;;<\/p>\n<\/li>\n<li>\n<p><strong>RUIM<\/strong>: &#8220;N\u00e3o consigo salvar imagens&#8221;;<\/p>\n<\/li>\n<li><strong>BOM<\/strong>: &#8220;Dentro da tela de redimensionar imagens, ao tentar salvar a mesma ap\u00f3s cortar 30% da largura da imagem, n\u00e3o consigo salvar as imagens&#8221;;<\/li>\n<\/ul>\n<p>Acho que deu para entender.<\/p>\n<h2>Passos detalhados e comportamento esperado<\/h2>\n<p>Certo, temos nossos bugs, mas como recriar a situa\u00e7\u00e3o? A primeira coisa que um desenvolvedor far\u00e1, \u00e9 tentar recriar a situa\u00e7\u00e3o para ver se o erro encontrado n\u00e3o \u00e9 espor\u00e1dico, se tem rela\u00e7\u00e3o com as mar\u00e9s ou a lua, ou se \u00e9 realmente um defeito encontrado consistentemente.<\/p>\n<p>Defeitos espor\u00e1dicos, como, &#8220;relat\u00f3rio n\u00e3o pode ser gerado durante os meses que possuem 31 dias&#8221; existem e s\u00e3o leg\u00edtimos, mas o desenvolvedor primeiro ir\u00e1 procurar se ele n\u00e3o vem de uma m\u00e1 configura\u00e7\u00e3o ou algum passo errado que o usu\u00e1rio possa ter executado no momento de usar a aplica\u00e7\u00e3o.<br \/>\nDefeitos consistentes s\u00e3o rapidamente avaliados pois temos certeza de quais passos realizar para reproduzir o erro. Sem os passos, o desenvolvedor dever\u00e1 contar com a sorte para reproduzir o danado &#8211; tarefa tediosa e que pode n\u00e3o resolver o problema.<\/p>\n<p>Vamos dizer que um erro \u00e9 encontrado em apenas 1\/10 das vezes em que se executam uma tarefa, aleatoriamente. O desenvolvedor testou 9 vezes, mas o erro n\u00e3o se apresentou. O que ele ir\u00e1 pensar? Que n\u00e3o existe erro algum e talvez o usu\u00e1rio estivesse em uma vers\u00e3o antiga, ou o conjunto de dados mudou.<\/p>\n<p>Mesmo que o respons\u00e1vel por reportar o defeito n\u00e3o saiba <strong>exatamente<\/strong> quais a\u00e7\u00f5es foram realizadas, em detalhes, para incluir no relat\u00f3rio, um conjunto m\u00ednimo de passos ajuda muito.<\/p>\n<p>Exemplo:<\/p>\n<ul>\n<li><strong>RUIM<\/strong>: &#8220;Loguei no sistema e cliquei em imprimir no relat\u00f3rio.&#8221;;<\/li>\n<li><strong>BOM<\/strong>:\n<ul>\n<li>Logar no sistema com usu\u00e1rio que tenha permiss\u00e3o para gerar relat\u00f3rios;<\/li>\n<li>Clicar na se\u00e7\u00e3o de relat\u00f3rios;<\/li>\n<li>Escolher o relat\u00f3rio de faturamento;<\/li>\n<li>Agrupar por m\u00eas e filial;<\/li>\n<li>Clicar em gerar relat\u00f3rio;<\/li>\n<li>Sistema apresenta uma tela azul;<\/li>\n<li>Sistema deveria apresentar uma tela com um relat\u00f3rio em PDF, contendo o relat\u00f3rio de faturamento mensal, agrupado por filial;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>A diferen\u00e7a entre os dois \u00e9 gritante.<\/p>\n<p>Quanto ao comportamento esperado, ele tamb\u00e9m \u00e9 fundamental para quem for testar o bug e confirmar que o mesmo est\u00e1 resolvido. Al\u00e9m dos passos de testes, o comportamento esperado \u00e9 o prego no caix\u00e3o do defunto &#8211; ele trat\u00e1 a certeza para o desenvolvedor de que o problema morreu.<\/p>\n<h2>Contexto<\/h2>\n<p>Informa\u00e7\u00f5es de contexto s\u00e3o cada vez mais importantes, conforme os mesmos s\u00e3o distribu\u00eddos por uma gama muito maior de clientes &#8211; a web, por exemplo.<\/p>\n<p>Um bom contexto cont\u00e9m:<\/p>\n<ul>\n<li>Sistema operacional e vers\u00e3o;<\/li>\n<li>Navegador utilizado e vers\u00e3o (em aplica\u00e7\u00f5es web);<\/li>\n<li>Vers\u00e3o do software que est\u00e1 sendo utilizado;<\/li>\n<li>Informa\u00e7\u00f5es relevantes ao uso do sistema (dados, usu\u00e1rios, grupos e permiss\u00f5es, etc);<\/li>\n<li>Condi\u00e7\u00f5es especiais (com GPS do celular ligado, com pouca bateria no notebook, com a rede ligada, etc);<\/li>\n<\/ul>\n<p>Em casos extremos, como aplica\u00e7\u00f5es gr\u00e1ficas ou desktops, qual placa de v\u00eddeo, qual resolu\u00e7\u00e3o utilizada, etc. Quanto maior o n\u00famero de detalhes, mais f\u00e1cil.<\/p>\n<h2>Prioridade<\/h2>\n<p>N\u00e3o confunda prioridade com criticidade. Prioridade \u00e9 o quanto um bug impacta no dia a dia do usu\u00e1rio. Um bug cr\u00edtico em uma funcionalidade usada apenas uma vez no ano, \u00e9 muito importante, mas um bug de severidade m\u00e9dia em uma ferramenta utilizada <strong>todos os dias<\/strong> tem prioridade muito maior de resolu\u00e7\u00e3o.<\/p>\n<h2>Screenshots<\/h2>\n<p>Ah, os screenshots. Eles s\u00e3o muito \u00fateis para provar que o usu\u00e1rio n\u00e3o est\u00e1 ~~louco~~ sonhando. Brincadeiras \u00e0 parte, os screenshots colocam o desenvolvedor numa m\u00e1quina do tempo e na m\u00e1quina do usu\u00e1rio. <strong>Principalmente<\/strong> se o bug envolver qualquer tipo de tela ou interface de usu\u00e1rio.<\/p>\n<p>N\u00e3o \u00e9 t\u00e3o dif\u00edcil, ent\u00e3o, sempre que poss\u00edvel, tire um screenshot, desenhe em cima dele, aponte uma seta para o problema. O desenvolvedor ser\u00e1 muito grato.<\/p>\n<h2>Quando fechar um bug<\/h2>\n<p>Existe ciclo de vida natural de um bug, que varia de empresa para empresa, mas o mais simples geralmente acontece assim:<\/p>\n<ol>\n<li>Defeito \u00e9 encontrado;<\/li>\n<li>Bug \u00e9 relatado;<\/li>\n<li>Desenvolvedor faz uma triagem do bug;<\/li>\n<li>Desenvolvedor resolve o bug;<\/li>\n<li>Desenvolvedor altera o status do bug para o relator conferir se o problema realmente foi resolvido;<\/li>\n<li>Relator fecha o bug (ou reabre, caso o conserto n\u00e3o tenha sido muito bom &#8211; neste caso, volte para item 3);<\/li>\n<\/ol>\n<p>Este \u00e9 o fluxo m\u00ednimo que temos de trabalho. Quando o bug resolvido chegar na &#8220;mesa&#8221; do relator, ele deve separar um tempo para fazer o teste da resolu\u00e7\u00e3o, o quanto antes melhor e dar andamento nos processos.<\/p>\n<p>Se <strong>outro<\/strong> defeito foi encontrado, crie outro bug. A maior parte das ferramentas atuais permitem que voc\u00ea referencie bugs e\/ou tarefas, facilitando o desenvolvedor a acompanhar o hist\u00f3rico.<\/p>\n<h2>Pensamentos finais<\/h2>\n<p>Escrever relat\u00f3rios de erros n\u00e3o \u00e9 dif\u00edcil. \u00c9 um processo em que se colabora com a constru\u00e7\u00e3o do software, ent\u00e3o deve ser minimamente organizado e coerente. Desenvolvedores n\u00e3o tem bolas de cristal e n\u00e3o s\u00e3o hackers do tipo Matrix, onde vem tudo em c\u00f3digo o tempo todo.<\/p>\n<p>Um bom relat\u00f3rio de bugs \u00e9 certamente apreciado e muito mais legal de ser resolvido do que um mau relat\u00f3rio. Seja bonzinho e nos ajude a te ajudar :D.<\/p>\n<h2>Links interessantes<\/h2>\n<ul>\n<li><a href=\"http:\/\/martiancraft.com\/blog\/2014\/07\/good-bug-reports\/\">Blog martiancraft<\/a>;<\/li>\n<li><a href=\"https:\/\/viget.com\/extend\/tips-for-writing-better-bug-reports\">Blog Viget<\/a>;<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Escrever software \u00e9 dificil. Manter um software atualizado e em funcionamento sem defeitos, \u00e9 ainda mais dificil. Uma das ferramentas mais importantes para que isso ocorra, isto \u00e9, a cria\u00e7\u00e3o e manuten\u00e7\u00e3o de um bom software, com o m\u00ednimo de defeitos (nenhum software \u00e9 perfeito), \u00e9 sem d\u00favida, os relat\u00f3rios de defeitos, ou bug reports. &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/geoadmin.com.br\/?p=631\" class=\"more-link\">Leia mais<span class=\"screen-reader-text\"> &#8220;Como escrever bons relat\u00f3rios de bugs&#8221;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[51,59,30,29,56,45,52],"class_list":["post-631","post","type-post","status-publish","format-standard","hentry","category-sem-categoria","tag-agil","tag-bugs","tag-desenvolvimento-de-sistemas","tag-dev","tag-devops","tag-python","tag-scrum"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=631"}],"version-history":[{"count":1,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/631\/revisions"}],"predecessor-version":[{"id":1319,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/631\/revisions\/1319"}],"wp:attachment":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}