<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Testes - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Testes - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 28 May 2026 16:39:31 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/testes/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como realizar testes de integração usando JUnit 5 e TestContainers com SpringBoot ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Sameer Shukla TestContainers é uma biblioteca que ajuda você a executar contêineres Docker específicos do módulo para simplificar o teste de integração. Esses contêineres do Docker são leves e, uma vez que os testes são concluídos, os contêineres são destruídos. Neste artigo, vamos entender o que é o ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-realizar-testes-de-integracao-usando-junit-5-e-testcontainers-com-springboot/</link>
                <guid isPermaLink="false">66a7076397bcd504087699de</guid>
                
                    <category>
                        <![CDATA[ Testes ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kris Lagerström ]]>
                </dc:creator>
                <pubDate>Thu, 05 Sep 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/testcontainers-logo.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/integration-testing-using-junit-5-testcontainers-with-springboot-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Perform Integration Testing using JUnit 5 and TestContainers with SpringBoot</a>
      </p><p>Escrito por: Sameer Shukla</p><p>TestContainers é uma biblioteca que ajuda você a executar contêineres Docker específicos do módulo para simplificar o teste de integração.</p><p>Esses contêineres do Docker são leves e, uma vez que os testes são concluídos, os contêineres são destruídos.</p><p>Neste artigo, vamos entender o que é o TestContainers e como ele ajuda você a escrever testes mais confiáveis.</p><p>Também vamos entender os componentes importantes (anotações e métodos) da biblioteca que ajudam você a escrever os testes.</p><p>Finalmente, aprenderemos a escrever um teste de integração adequado no SpringBoot usando a biblioteca TestContainers e seus componentes.</p><h2 id="limita-es-do-teste-com-um-banco-de-dados-h2-na-mem-ria">Limitações do teste com um banco de dados H2 na memória</h2><p>A abordagem mais comum para o teste de integração hoje é usar um banco de dados H2 na memória. Existem, no entanto, certas limitações para esse método.</p><p>Em primeiro lugar, digamos que estamos usando a versão 8.0 do MySQL em produção, mas que nossos testes de integração estão usando H2. Nunca poderemos executar nossos testes para a versão do banco de dados em execução em produção.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-303.png" class="kg-image" alt="image-303" width="480" height="517" loading="lazy"><figcaption>Aplicação do SpringBoot com banco de dados MySQL e H2</figcaption></figure><p>‌Em segundo lugar, os casos de teste são menos confiáveis porque, em produção, estamos usando um banco de dados totalmente diferente – e os testes estão apontando para o H2. A aplicação pode ter problemas em produção, mas os testes de integração podem ser bem-sucedidos.</p><p>Eu estava tentando acessar meu serviço RESTful localmente e me deparei com este erro:</p><p><strong>"Caused by: org.postgresql.util.PSQLException: FATAL: database "example_db" does not exist"</strong>.</p><p>Ele aconteceu por causa de um problema de permissão, mas os testes locais funcionaram bem.</p><p>Por fim, conforme documentado <a href="https://h2database-com.translate.goog/html/features.html?_x_tr_sch=http&amp;_x_tr_sl=en&amp;_x_tr_tl=pt&amp;_x_tr_hl=en&amp;_x_tr_pto=wapp#compatibility">aqui, na seção Compatibility</a> (documentação em inglês), o H2 é compatível com outros bancos de dados apenas até certo ponto. Existem algumas áreas onde o H2 é incompatível. Se você precisar usar "nativeQueries" em uma aplicação do SpringBoot, por exemplo, usar o H2 pode causar problemas.</p><h2 id="apresentando-a-biblioteca-testcontainers">Apresentando a biblioteca TestContainers</h2><p>Ao usar TestContainers, podemos superar as limitações do H2.</p><ul><li>Os testes de integração apontarão para a mesma versão do banco de dados que está em produção. Assim, podemos vincular nossa imagem de banco de dados do TestContainer à mesma versão em execução na produção.</li><li>Os testes de integração são muito mais confiáveis porque a aplicação e os testes estarão usando o mesmo tipo e versão de banco de dados, não havendo problemas de compatibilidade, portanto, nos casos de teste.</li></ul><h2 id="o-que-s-o-os-testcontainers">O que são os TestContainers?</h2><p>A biblioteca TestContainers é uma API <em>wrapper</em> sobre o Docker. Quando escrevemos código para criar um contêiner nos bastidores, ele pode ser traduzido para algum comando do Docker como, por exemplo‌:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-283.png" class="kg-image" alt="image-283" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-283.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-283.png 932w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Criação do MySQLContainer</figcaption></figure><p>Este código pode ser traduzido para algo como o seguinte:</p><pre><code class="language-docker">docker run -d --env MYSQL_DATABASE=example_db --env MYSQL_USER=test --env MYSQL_PASSWORD=test ‘mysql:latest’ 
</code></pre><p>O TestContainers tem um nome de método "<em>withCommand</em>". Você o usa para definir o comando que deve ser executado dentro do contêiner do Docker, o que confirma que o TestContainers é uma API <em>wrapper </em>sobre o Docker.</p><p>O TestContainers baixa as imagens MySQL, Postgres, Kafka, Redis e as executa em um contêiner. O MySQLContainer executará um banco de dados do MySQL em um contêiner e os casos de teste podem se conectar a ele na máquina local. Uma vez que a execução termina, o banco de dados desaparecerá – ele simplesmente é excluído da máquina. Nos casos de teste, podemos iniciar quantas imagens de contêiner quisermos.</p><p>O TestContainers suporta JUnit 4, JUnit 5 e Spock. Se você for ao site TestContainers.org, basta visitar a seção <em>QuickStart</em> que explica como usá-lo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-284.png" class="kg-image" alt="image-284" width="600" height="400" loading="lazy"><figcaption>TestContainers.org: como começar com o Test Framework</figcaption></figure><p>O TestContainers tem suporte a quase todos os bancos de dados, do MySQL e Postgres ao CockroachDB. Você pode encontrar mais informações sobre isso no site TestContainers.org, na seção <em>Modules</em>:‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-285.png" class="kg-image" alt="image-285" width="600" height="400" loading="lazy"><figcaption>Suporte do TestContainers para módulos de bancos de dados</figcaption></figure><p>‌O TestContainers também suporta módulos de nuvem como o módulo da GCloud e o módulo do Azure. Se sua aplicação estiver sendo executada no Google Cloud, o TestContainers terá suporte para Cloud Spanner, Firestore, Datastore e assim por diante.‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-286.png" class="kg-image" alt="image-286" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-286.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-286.png 975w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Suporte do TestContainers para o módulo da GCloud</figcaption></figure><p>Até agora, no artigo, falamos apenas sobre bancos de dados, mas o TestContainers suporta vários outros componentes, como Kafka, SOLR, Redis e muito mais.</p><h2 id="como-usar-a-biblioteca-testcontainers">Como usar a biblioteca TestContainers</h2><p>Neste artigo, vamos explorar o TestContainers com o JUnit 5. Para implementar o TestContainers, precisamos entender algumas anotações, métodos e bibliotecas importantes do TestContainers que precisamos implementar em nosso projeto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-288.png" class="kg-image" alt="image-288" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-288.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-288.png 924w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Bibliotecas TestContainers</figcaption></figure><h3 id="anota-es-em-testcontainers">Anotações em TestContainers</h3><p>Duas anotações importantes são necessárias em nossos testes para que o TestContainers funcione: @TestContainers e @Container.</p><p>@TestContainer é uma extensão do JUnit-Jupiter que inicia e interrompe automaticamente os contêineres usados nos testes. Essa anotação encontra os campos que são marcados com @Container e chama os métodos específicos do ciclo de vida do contêiner. Aqui, os métodos do ciclo de vida do MySQLContainer serão invocados.‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-289.png" class="kg-image" alt="image-289" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-289.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-289.png 932w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>MySQLContainer</figcaption></figure><p>O MySQLContainer é declarado como estático, pois, se declararmos o contêiner como estático, um único contêiner será iniciado e será compartilhado entre todos os métodos de teste.</p><p>Se for uma variável de instância, um contêiner será criado para cada método de teste.</p><h2 id="m-todos-da-biblioteca-testcontainers">Métodos da biblioteca TestContainers</h2><p>Existem alguns métodos importantes na biblioteca TestContainers que você usará nos testes. É bom conhecê-los antes de usar a biblioteca.</p><ul><li><strong>withInitScript</strong>: usando 'withInitScript', podemos executar o .SQL para definir o esquema, tabelas e também adicionar os dados ao banco de dados. Resumindo, esse método é usado para executar o .SQL para popular o banco de dados.</li><li><strong>withReuse</strong> (true): usando o método 'withReuse', podemos habilitar a reutilização de contêineres. Esse método funciona bem em conjunto com a habilitação da propriedade "testcontainers.reuse.enable:true" no arquivo ".testcontainers.properties".</li><li><strong>start</strong>: usamos isso para iniciar o contêiner.</li><li><strong>withClasspathResourceMapping</strong>: usamos para mapear um recurso (arquivo ou diretório) no <em>classpath</em> para um caminho dentro do contêiner. Isso só funcionará se você estiver executando seus testes fora de um contêiner do Docker.</li><li><strong>withCommand</strong>: define o comando que deve ser executado dentro do contêiner do Docker.</li><li><strong>withExposedPorts</strong>: usado para definir a porta na qual o contêiner escuta.</li><li><strong>withFileSystemBind</strong>: usado para mapear um arquivo/diretório do sistema de arquivos local para o contêiner.</li></ul><h2 id="caso-de-uso-do-testcontainers">Caso de uso do TestContainers</h2><p>No exemplo que veremos agora, a aplicação se comunicará apenas com o banco de dados e escreverá os testes de integração para ele usando o TestContainers. Em seguida, estenderemos o caso de uso implementando o Redis no meio.</p><p>Se os dados existirem no cache do Redis, eles serão retornados; caso contrário, ele mergulhará no banco de dados para salvar e recuperar com base na chave.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-308.png" class="kg-image" alt="image-308" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-308.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/09/image-308.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-308.png 1047w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Caso de uso - a solicitação acessa o cache do Redis e retorna, caso a informação esteja lá. Do contrário, é feito o acesso ao BD do MySQL</figcaption></figure><p>O serviço é simples. Ele tem 2 endpoints – o primeiro é para criar um usuário e o segundo é para encontrar um usuário por e-mail. Se o usuário for encontrado, ele será retornado; caso contrário, obteremos um 404. O código da classe de serviço tem esta aparência:‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-291.png" class="kg-image" alt="image-291" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-291.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-291.png 975w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Componente de serviço</figcaption></figure><p>Vamos escrever os testes para essa classe. Você pode encontrar toda a base de código <a href="https://github.com/kslagerstrom/testcontainers-examples">aqui</a>:‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-292.png" class="kg-image" alt="image-292" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-292.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-292.png 975w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Classe de teste</figcaption></figure><p>A classe de teste é marcada com a anotação @TestContainers, que inicia/para o contêiner. Usamos a anotação @Container para chamar os métodos específicos do ciclo de vida do contêiner.</p><p>Além disso, o "MySQLContainer" é declarado como estático porque, então, um único contêiner é iniciado. Em seguida, ele é compartilhado entre todos os métodos de teste (já discutimos a importância dessas anotações).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-293.png" class="kg-image" alt="image-293" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-293.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-293.png 975w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>BeforeAll</figcaption></figure><p>Em seguida, precisamos escrever um método de configuração marcado com @BeforeAll, onde habilitamos o método "withReuse". Isso nos ajuda a reutilizar os contêineres existentes. Estamos usando o método "withInitScript" para executar o arquivo ".sql" e, em seguida, iniciar o contêiner.‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-294.png" class="kg-image" alt="image-294" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-294.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-294.png 975w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Sobrescrevendo as Properties</figcaption></figure><p>‌@DynamicPropertySource nos ajuda a sobrescrever as propriedades declaradas no arquivo <em>properties</em>. Escrevemos esse método para permitir que o TestContainers crie o URL, o nome de usuário e a senha por conta própria – caso contrário, podemos enfrentar erros.</p><p>Por exemplo, ao remover o nome de usuário e a senha, podemos enfrentar um erro 'Access denied' (acesso negado, em português), que pode nos confundir. Portanto, é melhor permitir que o TestContainer atribua essas propriedades dinamicamente por conta própria.</p><p>É isso – estamos prontos para executar os casos de teste:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-295.png" class="kg-image" alt="image-295" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-295.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-295.png 695w" width="600" height="400" loading="lazy"><figcaption>Casos de teste</figcaption></figure><p>Execute @AfterAll para parar o contêiner. Caso contrário, ele poderá continuar sendo executado em sua máquina local se você não o parar explicitamente.‌</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-296.png" class="kg-image" alt="image-296" width="600" height="400" loading="lazy"></figure><h2 id="como-usar-o-genericcontainer">Como usar o GenericContainer</h2><p>‌‌GenericContainer é o contêiner mais flexível. Ele facilita a execução de quaisquer imagens de contêiner dentro do GenericContainer.</p><p>Agora que temos o Redis em seu devido lugar, tudo o que precisamos fazer em nosso caso de teste é ativar um GenericContainer com a imagem do Redis.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-297.png" class="kg-image" alt="image-297" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-297.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-297.png 975w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>GenericContainer para o Redis</figcaption></figure><p>Em seguida, iniciamos o contêiner genérico do Redis em @BeforeAll e o paramos com o método de desmontagem @AfterAll.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-298.png" class="kg-image" alt="image-298" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-298.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-298.png 859w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Iniciando os contêineres</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-299.png" class="kg-image" alt="image-299" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/image-299.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-299.png 667w" width="600" height="400" loading="lazy"><figcaption>Parando os contêineres</figcaption></figure><h2 id="conclus-o">Conclusão</h2><p>É extremamente fácil usar o TestContainers em nossa aplicação para escrever testes melhores. A curva de aprendizado não é muito íngreme e tem suporte para vários módulos diferentes de uma variedade de bancos de dados, como Kafka, Redis e outros.</p><p>Escrever testes usando o TestContainers torna nossos testes muito mais confiáveis. O único lado negativo é que os testes são lentos em comparação aos do H2. Isso ocorre porque o H2 está na memória e o TestContainers leva tempo para baixar a imagem, executar o contêiner e executar toda a configuração que discutimos neste artigo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Teste do JUnit com o Maven no VSCode ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Clark Jason Ngo Instalar o VSCode Configuração aqui: Configurando o Visual Studio Code [https://code-visualstudio-com.translate.goog/docs/setup/setup-overview?_x_tr_sl=en&_x_tr_tl=pt] Instalar e criar um projeto do Maven Guia de instalação completo aqui: Maven – Maven em 5 minutos [https://maven-apache-org.translate.goog/guides/getting-started/maven-in-five-minutes.html?_x_tr_sl=en&_x_tr_tl=pt]  (em inglês) Se você tem o Maven instalado, siga estas etapas: Gerar o projeto ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/teste-do-junit-com-o-maven-no-vscode/</link>
                <guid isPermaLink="false">66a6d6e997bcd504087699d4</guid>
                
                    <category>
                        <![CDATA[ Testes ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kris Lagerström ]]>
                </dc:creator>
                <pubDate>Wed, 04 Sep 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_8zPHl_wSifWv_DBOkYGEzQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/cjn-junit-test-with-maven-in-vscode/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JUnit Test with Maven in VSCode</a>
      </p><p>Escrito por: Clark Jason Ngo</p><h3 id="instalar-o-vscode">Instalar o VSCode</h3><p>Configuração aqui: <a href="https://code-visualstudio-com.translate.goog/docs/setup/setup-overview?_x_tr_sl=en&amp;_x_tr_tl=pt">Configurando o Visual Studio Code</a></p><h3 id="instalar-e-criar-um-projeto-do-maven">Instalar e criar um projeto do Maven</h3><p>Guia de instalação completo aqui: <a href="https://maven-apache-org.translate.goog/guides/getting-started/maven-in-five-minutes.html?_x_tr_sl=en&amp;_x_tr_tl=pt">Maven – Maven em 5 minutos</a> (em inglês)</p><p>Se você tem o Maven instalado, siga estas etapas:</p><p><strong><strong>Gerar o projeto</strong></strong></p><pre><code>mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
</code></pre><p><strong><strong>Mudar para o diretório do projeto</strong></strong></p><pre><code>cd my-app
</code></pre><p><strong><strong>Construir o projeto</strong></strong></p><pre><code>mvn package
</code></pre><p><strong><strong>Testar e compilar o projeto</strong></strong></p><pre><code>java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
</code></pre><p><strong>Você deve obter uma saída com:</strong> Hello World!</p><h3 id="modificar-nosso-projeto">Modificar nosso projeto</h3><p>Vamos começar criando funções matemáticas simples</p><p>Procure o arquivo <code>App.java</code> e substitua o conteúdo por este código:</p><pre><code class="language-java">package com.mycompany.app;

public class App 
{
  public static int add(int firstNumber, int secondNumber) {
    return firstNumber + secondNumber;
  }

  public static int multiply(int multiplicand, int multiplier) {
    return multiplicand * multiplier;
  }

  public static int divide(int dividend, int divisor) {
    if (divisor == 0)
      throw new IllegalArgumentException("Cannot divide by zero (0)."); // Não pode dividir por zero (0).

    return dividend / divisor;
  }
  public static void main( String[] args )
  {
    System.out.println(App.add(3, 3)); 
  }
}
</code></pre><p>Procure por <code>AppTest.java</code> e substitua o conteúdo por este código:</p><pre><code class="language-java">package com.mycompany.app;

import static org.junit.Assert.assertTrue;

import org.junit.Assert;
import org.junit.Test;

/**
* Teste unitário para App simples. 
*/ 
public class AppTest 
{
    /**
    *Teste Rigoroso :-)
    */
    @Test
    public void shouldAnswerWithTrue() // deveResponderComVerdadeiro
    {
        assertTrue( true );
    }
    @Test
    public void add_TwoPlusTwo_ReturnsFour() { // adicionar_DoisMaisDois_RetornaQuatro
      // Organizar
      final int expected = 4;

      // Agir
      final int actual = App.add(2, 2);

      // Afirmar
      Assert.assertEquals(expected, actual);
    }    
    @Test
    public void multiply_FourTimesTwo_ReturnsEight() { // multiplicar_QuatroVezesDois_RetornaOito
      // Organizar
      final int expected = 8;

      // Agir
      final int actual = App.multiply(4, 2);

      // Afirmar
      Assert.assertEquals(expected, actual);
    }        

    @Test
    public void divide_TenDividedTwo_ReturnsFive() { // dividir_DezDivididoPorDois_RetornaCinco
      // Organizar
      final int expected = 5;

      // Agir
      final int actual = App.divide(10, 2);

      // Afirmar
      Assert.assertEquals(expected, actual);
    }           
}
</code></pre><p>Você pode continuar criando testes como, por exemplo:</p><pre><code class="language-java">@Test    
public void multiply_FiftyTimesTwo_ReturnsOneHundred()  // multiplicar_CinquentaVezesDois_RetornaCem
{      
  // // Organizar
  final int expected = 100;        
  // // Agir
  final int actual = App.multiply(50, 2);        
  // // Afirmar
  Assert.assertEquals(actual, expected);    
}
</code></pre><p><strong><strong>Construir o projeto</strong></strong></p><pre><code>mvn package
</code></pre><p>Saída:</p><pre><code>[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.mycompany.app.AppTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 s - in com.mycompany.app.AppTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
</code></pre><p><strong><strong>Testar e compilar o projeto</strong></strong></p><pre><code class="language-java">java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
</code></pre><p>Saída:</p><pre><code>6
Hello World!
</code></pre><p>Uma maneira alternativa de executar os testes é clicar em <em>Run Test</em> dentro de <code>AppTest.java</code></p><p>No exemplo abaixo, <em>Run Test</em> está localizado logo abaixo da linha de código 44.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_TFBgactTWvK7ColY1YgxEw.png" class="kg-image" alt="1_TFBgactTWvK7ColY1YgxEw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/1_TFBgactTWvK7ColY1YgxEw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/09/1_TFBgactTWvK7ColY1YgxEw.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_TFBgactTWvK7ColY1YgxEw.png 1240w" sizes="(min-width: 720px) 720px" width="1240" height="680" loading="lazy"><figcaption>Nos comentários, "Arrange" (organizar), "Act" (agir) e Assert (afirmar)</figcaption></figure><p><strong><strong>Visualizar </strong>t<strong>estes e </strong>r<strong>elatório de </strong>t<strong>este</strong></strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_uNAouJG881s3iP0rX2zeVw.png" class="kg-image" alt="1_uNAouJG881s3iP0rX2zeVw" width="468" height="296" loading="lazy"></figure><h3 id="migrando-do-junit-4-para-o-junit-5">Migrando do JUnit 4 para o JUnit 5</h3><p>Altere as dependências do seu <code>pom.xml</code> para:</p><pre><code class="language-xml">  &lt;dependencies&gt;
      &lt;dependency&gt;
          &lt;groupId&gt;org.junit.jupiter&lt;/groupId&gt;
          &lt;artifactId&gt;junit-jupiter-api&lt;/artifactId&gt;
          &lt;version&gt;5.4.2&lt;/version&gt;
          &lt;scope&gt;test&lt;/scope&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
          &lt;groupId&gt;org.junit.jupiter&lt;/groupId&gt;
          &lt;artifactId&gt;junit-jupiter-engine&lt;/artifactId&gt;
          &lt;version&gt;5.4.2&lt;/version&gt;
          &lt;scope&gt;test&lt;/scope&gt;
      &lt;/dependency&gt;
  &lt;/dependencies&gt;
</code></pre><p>Altere seu <code>AppTest.java</code> para:</p><pre><code class="language-java">package com.mycompany.app;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

/** 
* Teste unitário para App simples. 
*/
public class AppTest 
{
    /**
    * Teste Rigoroso :-)
    */ 
    @Test
    public void shouldAnswerWithTrue() // deveResponderComVerdadeiro
    {
        assertTrue( true );
    }
    @Test
    public void add_TwoPlusTwo_ReturnsFour() { // adicionar_DoisMaisDois_RetornaQuatro
      // Organizar
      final int expected = 4;

      // Agir
      final int actual = App.add(2, 2);

      // Afirmar
      assertEquals(expected, actual);
    }    
    @Test
    public void multiply_FourTimesTwo_ReturnsEight() { // multiplicar_QuatroVezesDois_RetornaOito
      // Organizar
      final int expected = 8;

      // Agir
      final int actual = App.multiply(4, 2);

      // Afirmar
      assertEquals(expected, actual);
    }        

    @Test
    public void divide_TenDividedTwo_ReturnsFive() { // dividir_DezDivididoPorDois_RetornaCinco
      // Organizar
      final int expected = 5;

      // Agir
      final int actual = App.divide(10, 2);

      // Afirmar
      assertEquals(expected, actual);
    }           
}
</code></pre><p><strong><strong>Adicionando cobertura de teste</strong></strong></p><p><strong><strong>Verifique o relatório de cobertura de teste</strong></strong></p><p>No VSCode, abra o Extension MarketPlace e pesquise Coverage Gutters</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_OjkwUa9oX9s8MNgTMG6WdQ.png" class="kg-image" alt="1_OjkwUa9oX9s8MNgTMG6WdQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/1_OjkwUa9oX9s8MNgTMG6WdQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_OjkwUa9oX9s8MNgTMG6WdQ.png 718w" width="718" height="304" loading="lazy"></figure><p>Clique no botão Instalar (ou <em>Install</em>)</p><p>Abra o arquivo <code>pom.xml</code> na sua pasta raiz e substitua o conteúdo pelo <a href="http://bit.ly/2Df1Oj2">pom.xml no GitHub</a> para adicionar suporte a um <em>plug-in</em>.</p><pre><code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

  &lt;groupId&gt;com.mycompany.app&lt;/groupId&gt;
  &lt;artifactId&gt;my-app&lt;/artifactId&gt;
  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;

  &lt;name&gt;my-app&lt;/name&gt;
  &lt;!-- IMPORTANTE troque este endereço pelo do site do projeto --&gt;
  &lt;url&gt;http://www.exemplo.com&lt;/url&gt;

  &lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;maven.compiler.source&gt;1.7&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;1.7&lt;/maven.compiler.target&gt;
  &lt;/properties&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.junit.jupiter&lt;/groupId&gt;
        &lt;artifactId&gt;junit-jupiter-api&lt;/artifactId&gt;
        &lt;version&gt;5.4.2&lt;/version&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.junit.jupiter&lt;/groupId&gt;
        &lt;artifactId&gt;junit-jupiter-engine&lt;/artifactId&gt;
        &lt;version&gt;5.4.2&lt;/version&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;


  &lt;build&gt;
    &lt;pluginManagement&gt;&lt;!-- faça o lockdown das versões dos plug-ins para evitar o uso dos padrões do Maven (pode ser movido para o pom pai) --&gt;
      &lt;plugins&gt;
        &lt;plugin&gt;
          &lt;groupId&gt;org.jacoco&lt;/groupId&gt;
          &lt;artifactId&gt;jacoco-maven-plugin&lt;/artifactId&gt;
          &lt;version&gt;0.8.2&lt;/version&gt;
          &lt;executions&gt;
              &lt;execution&gt;
                  &lt;goals&gt;
                      &lt;goal&gt;prepare-agent&lt;/goal&gt;
                  &lt;/goals&gt;
              &lt;/execution&gt;
              &lt;execution&gt;
                  &lt;id&gt;report&lt;/id&gt;
                  &lt;phase&gt;prepare-package&lt;/phase&gt;
                  &lt;goals&gt;
                      &lt;goal&gt;report&lt;/goal&gt;
                  &lt;/goals&gt;
              &lt;/execution&gt;
          &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;!-- Ciclo de vida limpo; consulte https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle (em inglês) --&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.1.0&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;!-- Ciclo de vida padrão, empacotamento em jar; consulte https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging (em inglês) --&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.0.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.8.0&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.22.1&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.0.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-install-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.5.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-deploy-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.8.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;!-- Ciclo de vida do site; consulte https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle (em inglês) --&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-site-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.7.1&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-project-info-reports-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.0.0&lt;/version&gt;
        &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/pluginManagement&gt;
  &lt;/build&gt;
&lt;/project&gt;
</code></pre><p>Abra o terminal no VSCode e execute</p><pre><code>mvn install
mvn clean jacoco:prepare-agent install jacoco:report
</code></pre><p>Abra seu arquivo <code>App.java</code> na pasta <code>main/java/com/mycompany/app</code> e clique no botão <em>Watch</em> para verificar o relatório</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_eRmrtwQ23Gp6IGXRwphLvA.png" class="kg-image" alt="1_eRmrtwQ23Gp6IGXRwphLvA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/1_eRmrtwQ23Gp6IGXRwphLvA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_eRmrtwQ23Gp6IGXRwphLvA.png 974w" sizes="(min-width: 720px) 720px" width="974" height="677" loading="lazy"></figure><p>Barra vermelha: código de teste não coberto</p><p>Barra amarela: condição não coberta</p><p>Barra verde: código coberto</p><p>Abra o arquivo <code>index.html</code> na sua pasta <code>root/target/site/jacoco</code>.</p><p>Para abrir:</p><p>Eme seguida, cole (Ctrl + V para Windows e Command + V para MacOS) o caminho no seu navegador.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_jj1o8eqXMZ27xK9crCng9w.png" class="kg-image" alt="1_jj1o8eqXMZ27xK9crCng9w" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/1_jj1o8eqXMZ27xK9crCng9w.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_jj1o8eqXMZ27xK9crCng9w.png 787w" sizes="(min-width: 720px) 720px" width="787" height="387" loading="lazy"></figure><p>Você pode ver um relatório de cobertura de teste muito detalhado:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_LIgnn-CgO6vR9hBhZZGvug.png" class="kg-image" alt="1_LIgnn-CgO6vR9hBhZZGvug" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/1_LIgnn-CgO6vR9hBhZZGvug.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/1_LIgnn-CgO6vR9hBhZZGvug.png 974w" sizes="(min-width: 720px) 720px" width="974" height="214" loading="lazy"></figure><p>Obrigado pela leitura! 😉</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
