{"componentChunkName":"component---src-templates-docs-js","path":"/docs/testing-environments.html","result":{"data":{"markdownRemark":{"html":"<!-- This document is intended for folks who are comfortable with JavaScript, and have probably written tests with it. It acts as a reference for the differences in testing environments for React components, and how those differences affect the tests that they write. This document also assumes a slant towards web-based react-dom components, but has notes for other renderers. -->\n<p>Este documento aborda fatores que podem afetar o seu ambiente de testes assim como recomendações para alguns cenários.</p>\n<h3 id=\"test-runners\"><a href=\"#test-runners\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Test runners </h3>\n<p><em>Test runners</em> como <a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jest</a>, <a href=\"https://mochajs.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">mocha</a>, <a href=\"https://github.com/avajs/ava\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ava</a> te permitem escrever suítes de teste na forma de JavaScript, e executa-las como parte do seu processo de desenvolvimento. Adicionalmente, suítes de teste são executadas como parte da integração contínua.</p>\n<ul>\n<li>Jest é amplamente compatível com projetos em React, dando suporte à funcionalidades como mock de <a href=\"#mocking-modules\">módulos</a> e <a href=\"#mocking-timers\">temporizadores</a>, e suporte à <a href=\"#mocking-a-rendering-surface\"><code class=\"gatsby-code-text\">jsdom</code></a>. <strong>Se você utiliza o Create React App, o <a href=\"https://facebook.github.io/create-react-app/docs/running-tests\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jest já vem incluso desde o começo</a> com configurações padrão úteis.</strong></li>\n<li>Bibliotecas como <a href=\"https://mochajs.org/#running-mocha-in-the-browser\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">mocha</a> funcionam bem em ambientes com navegadores de verdade, e podem ajudar em testes que dependam explicitamente de navegadores.</li>\n<li>Testes <em>end-to-end</em> são utilizados para testar fluxos mais longos através de várias páginas, e requerem uma <a href=\"#end-to-end-tests-aka-e2e-tests\">configuração diferente</a>.</li>\n</ul>\n<h3 id=\"mocking-a-rendering-surface\"><a href=\"#mocking-a-rendering-surface\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Fazendo o mock de uma superfície de renderização </h3>\n<p>É comum que testes sejam executados em um ambiente que não possui acesso a uma superfície de renderização real como um navegador. Para esses ambientes, nós recomendamos simular um navegador com <a href=\"https://github.com/jsdom/jsdom\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">jsdom</code></a>, uma implementação de um navegador com um tamanho leve que é executada em Node.js.</p>\n<p>Na maioria dos casos, jsdom se comporta da mesma forma que um navegador comum, mas ela não tem funcionalidades como <a href=\"https://github.com/jsdom/jsdom#unimplemented-parts-of-the-web-platform\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">layout e navegação</a>. Ainda assim, ela continua sendo útil para a maioria dos testes de componentes web, já que ela consegue ser executada de forma mais rápida do que tendo que iniciar um navegador para cada teste. Ela também é executada no mesmo processo dos seus testes, o que possibilita que você escreva testes para examinar e fazer asserções sobre o DOM renderizado.</p>\n<p>Assim como em um navegador de verdade, jsdom nos permite modelar interações de usuário; testes podem disparar eventos em nós do DOM, e assim observar e fazer verificações sobre os efeitos colaterais dessas ações <a href=\"/docs/testing-recipes.html#events\"><small>(exemplo)</small></a>.</p>\n<p>Uma grande parte dos testes de UI podem ser escritos com a seguinte configuração: Jest sendo usado como <em>test runner</em>, renderização feita com o uso de jsdom, e com interações de usuário definidas a partir de sequências de eventos do navegador, com o uso da função auxiliar<code class=\"gatsby-code-text\">act()</code> <a href=\"/docs/testing-recipes.html\"><small>(exemplo)</small></a>. Grande parte dos testes da própria biblioteca do React são escritas com essa combinação, por exemplo.</p>\n<p>Se você está criando uma biblioteca que testa em sua maioria comportamentos específicos de um navegador, e necessita de um comportamento nativo de um navegador como <em>layout</em> ou <em>inputs</em> de verdade, você pode usar um <em>framework</em> como <a href=\"https://mochajs.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">mocha</a>.</p>\n<p>Em um ambiente onde você <em>não pode</em> simular um DOM (por exemplo, testes de componentes do React Native no Node.js), você poderia usar <a href=\"/docs/test-utils.html#simulate\">funções auxiliares de simulação de eventos</a> para simular interações com elementos. Como uma outra alternativa, você pode usar a função auxiliar<code class=\"gatsby-code-text\">fireEvent</code> da <a href=\"https://testing-library.com/docs/react-native-testing-library/intro\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">@testing-library/react-native</code></a>.</p>\n<p>Frameworks como <a href=\"https://www.cypress.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cypress</a>, <a href=\"https://github.com/GoogleChrome/puppeteer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">puppeteer</a> e <a href=\"https://www.seleniumhq.org/projects/webdriver/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">webdriver</a> são úteis para executar <a href=\"#end-to-end-tests-aka-e2e-tests\">testes end-to-end</a>.</p>\n<h3 id=\"mocking-functions\"><a href=\"#mocking-functions\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Fazendo o mock de funções </h3>\n<p>Ao escrever testes, nós gostaríamos de fazer o mock nas partes do nosso código que não possuem um equivalente dentro do nosso ambiente de testes (por exemplo, checar o status <code class=\"gatsby-code-text\">navigator.onLine</code> dentro do Node.js). Testes também podem espiar algumas funções e observar como outras partes do teste interagem com elas. Portanto, a possibilidade de fazer o mock de funções selecionadas por versões mais amigáveis para testes é algo bem útil.</p>\n<p>Isso é algo especialmente útil para a obtenção de dados (data fetching). Prefere-se normalmente que sejam usados dados “falsos” para testes a fim de evitar a lentidão e a inconstância causada pelo fetching de endpoints de uma API de verdade <a href=\"/docs/testing-recipes.html#data-fetching\"><small>(exemplo)</small></a>. Isso ajuda a fazer com que os testes sejam previsíveis. Bibliotecas como <a href=\"https://jestjs.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jest</a> e <a href=\"https://sinonjs.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sinon</a>, dentre outras, suportam o mock de funções. Para testes <em>end-to-end</em>, fazer o mock da sua rede de internet pode ser mais difícil, mas você provavelmente irá querer testar os endpoints da API de verdade ao fazê-los.</p>\n<h3 id=\"mocking-modules\"><a href=\"#mocking-modules\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Fazendo o mock de módulos </h3>\n<p>Alguns componentes dependem de módulos que podem não funcionar corretamente em ambientes de testes, ou que não são essenciais para os nossos testes. Um mock seletivo desses módulos pode ser útil, com o uso de substitutos adequados<a href=\"/docs/testing-recipes.html#mocking-modules\"><small>(exemplo)</small></a>.</p>\n<p>No Node.js, executadores de teste como o Jest <a href=\"https://jestjs.io/docs/en/manual-mocks\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">dão suporte ao mock de módulos</a>. Você também pode usar bibliotecas como <a href=\"https://www.npmjs.com/package/mock-require\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">mock-require</code></a>.</p>\n<h3 id=\"mocking-timers\"><a href=\"#mocking-timers\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Fazendo o mock de temporizadores </h3>\n<p>Alguns componentes podem estar usando funções com base no tempo como <code class=\"gatsby-code-text\">setTimeout</code>, <code class=\"gatsby-code-text\">setInterval</code>, ou <code class=\"gatsby-code-text\">Date.now</code>. Em ambientes de teste, fazer o mock dessas funções com substitutos que lhe permitam “avançar no tempo” pode ser de grande ajuda. Isso é ótimo para garantir que os seus testes executem de forma rápida! Testes que dependem de temporizadores ainda seriam resolvidos ordenadamente, mas de forma mais rápida<a href=\"/docs/testing-recipes.html#timers\"><small>(exemplo)</small></a>. A maioria dos frameworks, incluindo o <a href=\"https://jestjs.io/docs/en/timer-mocks\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jest</a>, <a href=\"https://sinonjs.org/releases/v7.3.2/fake-timers/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sinon</a> e <a href=\"https://github.com/sinonjs/lolex\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lolex</a>, permitem que você faça o mock de temporizadores nos seus testes.</p>\n<p>Às vezes, você pode não querer fazer o mock de temporizadores. Por exemplo, talvez você está testando uma animação, ou interagindo com um endpoint que é sensível a tempo (como uma API com um limitador de requisições). Bibliotecas com mocks de temporizadores te permitem habilitar e desabilitar esses mocks para cada teste/suíte de testes, de forma que você pode explicitamente escolher como esses testes irão ser executados.</p>\n<h3 id=\"end-to-end-tests-aka-e2e-tests\"><a href=\"#end-to-end-tests-aka-e2e-tests\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Testes end-to-end </h3>\n<p>Testes <em>end-to-end</em> são úteis para testar grandes fluxos de trabalho, especialmente quando eles são críticos para o seu negócio (por exemplo, pagamentos ou criação de contas). Para esses testes, você provavelmente irá querer testar não só a forma que um navegador de verdade renderiza a aplicação inteira, como também a forma em que ele busca dados dos endpoints da API de verdade, usa sessões e cookies, e navega entre links diferentes. Você também pode querer fazer verificações não somente no estado do DOM, como também nos dados da aplicação (por exemplo, verificar se as atualizações foram persistidas ou não para o banco de dados).</p>\n<p>Nesse cenário, poderiam ser utilizados frameworks como <a href=\"https://www.cypress.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cypress</a> ou uma biblioteca como <a href=\"https://github.com/GoogleChrome/puppeteer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">puppeteer</a> para que você possa navegar entre múltiplas rotas e fazer asserções sobre efeitos colaterais não somente no navegador, mas também possivelmente no backend.</p>","frontmatter":{"title":"Ambientes de Teste","next":null,"prev":"testing-recipes.html"},"fields":{"path":"content/docs/testing-environments.md","slug":"docs/testing-environments.html"}}},"pageContext":{"slug":"docs/testing-environments.html"}},"staticQueryHashes":[]}