<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lady{de}bug – Lady{de}bug</title><link>https://deploy-preview-14--ladydebug.netlify.app/</link><description>Recent content on Lady{de}bug</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Thu, 27 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://deploy-preview-14--ladydebug.netlify.app/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux Básico</title><link>https://deploy-preview-14--ladydebug.netlify.app/docs/2025/dezembro/linux-basico/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://deploy-preview-14--ladydebug.netlify.app/docs/2025/dezembro/linux-basico/</guid><description>
&lt;h2>Minhas anotações sobre o básicos do Linux&lt;span class="hx:absolute hx:-mt-20" id="minhas-anotações-sobre-o-básicos-do-linux">&lt;/span>
&lt;a href="#minhas-anota%c3%a7%c3%b5es-sobre-o-b%c3%a1sicos-do-linux" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2></description></item><item><title>Configurando o SonarQube Localmente</title><link>https://deploy-preview-14--ladydebug.netlify.app/docs/2025/setembro/20/configurando-o-sonar-qube-localmente/</link><pubDate>Sat, 20 Sep 2025 00:00:00 +0000</pubDate><guid>https://deploy-preview-14--ladydebug.netlify.app/docs/2025/setembro/20/configurando-o-sonar-qube-localmente/</guid><description>
&lt;p>&lt;strong>Isso não é um tutorial,&lt;/strong> é mais para o entendimento e estudo sobre a ferramenta e como aplicar ela em projetos pequenos, até médio porte, em repositórios fechados (código privado). Bom, como eu já tinha o SonarQube instalado na minha máquina, abaixo segue como configurar o Docker.&lt;/p>
&lt;hr>
&lt;h2>&lt;strong>Opção 1: Remover o container existente&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="opção-1-remover-o-container-existente">&lt;/span>
&lt;a href="#op%c3%a7%c3%a3o-1-remover-o-container-existente" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Para um trabalho de Pós-graduação eu tinha configurado para um projeto de estudo de análise de código, neste caso foi reconfigurar para outro projeto (depois eu configuro novamente correto para o projeto de estudo de análise de código).&lt;/p>
&lt;p>&lt;code>docker rm sonarqube&lt;/code>&lt;/p>
&lt;p>
&lt;img src="../content/docs/2025/setembro/20/img/image1.png" alt="image1.png" loading="lazy" />&lt;/p>
&lt;p>Agora posso executar o comando para subir um novo container:&lt;/p>
&lt;p>&lt;code>docker run -d --name sonarqube -p 9000:9000 sonarqube:lts-community&lt;/code>&lt;/p>
&lt;blockquote>
&lt;p>Sim, a versão é gratuíta, para aprendizado antes de sair pagando algo que não sabe usar.&lt;/p>
&lt;/blockquote>
&lt;p>
&lt;img src="../content/docs/2025/setembro/20/img/image2.png" alt="image2.png" loading="lazy" />&lt;/p>
&lt;h3>&lt;strong>Opção 2: Substituir o container automaticamente&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="opção-2-substituir-o-container-automaticamente">&lt;/span>
&lt;a href="#op%c3%a7%c3%a3o-2-substituir-o-container-automaticamente" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Se quiser forçar a substituição, use o parâmetro &amp;ndash;rm (remove ao parar) ou &amp;ndash;replace (caso use Podman). No Docker, geralmente removemos manualmente como acima.&lt;/p>
&lt;h3>&lt;strong>Opção 3: Verificar o status do container&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="opção-3-verificar-o-status-do-container">&lt;/span>
&lt;a href="#op%c3%a7%c3%a3o-3-verificar-o-status-do-container" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>docker start sonarqube&lt;/code>&lt;/p>
&lt;p>Para encerrar use o comando:&lt;/p>
&lt;p>&lt;code>docker stop sonarqube&lt;/code>&lt;/p>
&lt;h2>&lt;strong>Executar o SonarQube localmente&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="executar-o-sonarqube-localmente">&lt;/span>
&lt;a href="#executar-o-sonarqube-localmente" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Agora a parte que interessa é configurar localmente o SonarQube, e fazer um escaneamento básico.&lt;/p>
&lt;p>Primeiro um setup de configuração (acho que vale adicionar isso no script de desenvolvimento).&lt;/p>
&lt;h3>&lt;strong>1. Pré-requisitos&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="1-pré-requisitos">&lt;/span>
&lt;a href="#1-pr%c3%a9-requisitos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Java 11 ou superior&lt;/strong> instalado na máquina (SonarQube precisa do Java para rodar).&lt;/li>
&lt;li>&lt;strong>Docker&lt;/strong> (opcional, mas facilita a execução do SonarQube — realmente).&lt;/li>
&lt;/ul>
&lt;h3>&lt;strong>2. Baixando e rodando o SonarQube&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="2-baixando-e-rodando-o-sonarqube">&lt;/span>
&lt;a href="#2-baixando-e-rodando-o-sonarqube" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Link de download: &lt;a href="https://www.sonarsource.com/open-source-editions/sonarqube-community-edition/"target="_blank" rel="noopener">https://www.sonarsource.com/open-source-editions/sonarqube-community-edition/&lt;/a>&lt;/p>
&lt;p>Aqui a primeira parte de ajustar o docker então precisa se atentar a deixar ele executando, corretamente, sem problemas.&lt;/p>
&lt;p>&lt;code>docker run -d --name sonarqube -p 9000:9000 sonarqube:lts-community&lt;/code>&lt;/p>
&lt;p>Pronto! SonarQube rodando localmente.&lt;/p>
&lt;p>
&lt;img src="../content/docs/2025/setembro/20/img/image3.png" alt="image3.png" loading="lazy" />&lt;/p>
&lt;p>Ajuste as configurações de senha e segue para a página:&lt;/p>
&lt;p>
&lt;img src="../Configurando%20o%20SonarQube%20Localmente/image%203.png" alt="image.png" loading="lazy" />&lt;/p>
&lt;h3>&lt;strong>Configuração do SonarQube&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="configuração-do-sonarqube">&lt;/span>
&lt;a href="#configura%c3%a7%c3%a3o-do-sonarqube" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Acesse &lt;a href="http://localhost:9000/"target="_blank" rel="noopener">http://localhost:9000&lt;/a>&lt;/li>
&lt;li>Login padrão:
&lt;ul>
&lt;li>Usuário: admin&lt;/li>
&lt;li>Senha: admin&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Agora vamos configurar para fazer um escaneamento do projeto&lt;/p>
&lt;h3>&lt;strong>Gerando um Token de autenticação&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="gerando-um-token-de-autenticação">&lt;/span>
&lt;a href="#gerando-um-token-de-autentica%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>No menu superior direito, clique no seu usuário &amp;gt; My Account &amp;gt; Security.&lt;/li>
&lt;li>Em &amp;ldquo;Generate Tokens&amp;rdquo;, crie um novo token (ex: nome-projeto-token).&lt;/li>
&lt;li>Guarde esse token (será usado no scanner).&lt;/li>
&lt;/ol>
&lt;h3>&lt;strong>Instalando o SonarScanner&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="instalando-o-sonarscanner">&lt;/span>
&lt;a href="#instalando-o-sonarscanner" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>O &lt;strong>SonarScanner&lt;/strong> é o CLI para enviar seu código ao SonarQube. Ou seja, localmente via terminal vamos falar para ele ler o projeto e então temos a análise.&lt;/p>
&lt;h3>&lt;strong>Instalação via NPM (para projetos Node):&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="instalação-via-npm-para-projetos-node">&lt;/span>
&lt;a href="#instala%c3%a7%c3%a3o-via-npm-para-projetos-node" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>npm install -g sonarqube-scanner&lt;/code>&lt;/p>
&lt;p>Para referências de cada projeto segue: &lt;a href="https://docs.sonarsource.com/sonarqube-server/analyzing-source-code/scanners/sonarscanner"target="_blank" rel="noopener">https://docs.sonarsource.com/sonarqube-server/analyzing-source-code/scanners/sonarscanner&lt;/a>&lt;/p>
&lt;h3>&lt;strong>Configurando o SonarScanner no Projeto&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="configurando-o-sonarscanner-no-projeto">&lt;/span>
&lt;a href="#configurando-o-sonarscanner-no-projeto" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Na raiz do projeto, crie um arquivo chamado &lt;code>sonar-project.properties&lt;/code>:&lt;/p>
&lt;p>Exemplo:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-jsx" data-lang="jsx">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">projectKey&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">nome&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">projeto&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">projectName&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">Nome&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">projeto&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">projectVersion&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">1.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sources&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">language&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">js&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nx">php&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sourceEncoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">UTF&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">host&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">url&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">http&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="c1">//localhost:9000
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">sonar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">login&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">SEU_TOKEN_AQUI&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>&lt;strong>Problemas encontrados&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="problemas-encontrados">&lt;/span>
&lt;a href="#problemas-encontrados" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../Configurando%20o%20SonarQube%20Localmente/problema_encontrado_ao_rodar_o_escaneamento_2025-09-20_09-24.png" alt="problema encontrado ao rodar o escaneamento 2025-09-20_09-24.png" loading="lazy" />&lt;/p>
&lt;p>ERROR: You&amp;rsquo;re not authorized to run analysis. Please contact the project administrator.&lt;/p>
&lt;h3>&lt;strong>O que significa esse erro?&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="o-que-significa-esse-erro">&lt;/span>
&lt;a href="#o-que-significa-esse-erro" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>O SonarScanner está tentando enviar os resultados da análise para o SonarQube, mas o usuário (ou token) configurado &lt;strong>não tem permissão&lt;/strong> para realizar essa operação no projeto configurado no SonarQube.&lt;/p>
&lt;p>&lt;strong>Perfeito! Vamos ver o que fiz de errado&lt;/strong>: o nome do projeto no arquivo &lt;code>sonar-project.properties&lt;/code> não estava igual ao que eu configurei no SonarQube local.&lt;/p>
&lt;p>Agora pronto: quando executar o comando &lt;code>sonar-scanner&lt;/code> vai executar o escaneamento no projeto e seguida mostrar em tela os resultados.&lt;/p>
&lt;p>
&lt;img src="../content/docs/2025/setembro/20/img/TERMINAL_SUCESS_2025-09-20_09-33.png" alt="TERMINAL_SUCESS_2025-09-20_09-33.png" loading="lazy" />&lt;/p>
&lt;p>
&lt;img src="../content/docs/2025/setembro/20/img/EXECTUADO_2025-09-20_09-32.png" alt="EXECTUADO 2025-09-20_09-32.png" loading="lazy" />&lt;/p></description></item><item><title>Cypress e Boas Práticas de Automação</title><link>https://deploy-preview-14--ladydebug.netlify.app/docs/2024/outubro/cypress-e-boas-praticas-de-automacao/</link><pubDate>Thu, 24 Oct 2024 13:07:00 -0300</pubDate><guid>https://deploy-preview-14--ladydebug.netlify.app/docs/2024/outubro/cypress-e-boas-praticas-de-automacao/</guid><description>
&lt;p>Evitando o uso de &lt;em>Falsos Positivos&lt;/em> com Cypress. Segue abaixo um exemplo de um código, e um arquivo commands com um simples login na aplicação:&lt;/p>
&lt;p>&lt;img src="https://deploy-preview-14--ladydebug.netlify.app/assets/image/2024/exemplo-praticas-ruins.png" alt="exemplo-praticas-ruins" loading="lazy" />&lt;/p>
&lt;p>Essa aplicação estava ocorrendo um certo erro ao realizar o login, e foi adicionado o seguinte trecho de código na automação para poder realizar o login com sucesso:&lt;/p>
&lt;p>
&lt;img src=".././assets/image/2024/o_que_o_erro_faz.png" alt="o que o erro faz?" loading="lazy" />&lt;/p>
&lt;p>Mas o que esse trecho diz? Serve para suprimir os erros que ocorrem na aplicação durante a execução dos testes do Cypress.&lt;/p>
&lt;p>Como assim? Ao usar &lt;code>cy.on('uncaught:exception')&lt;/code> e retornar false, está instruindo o Cypress a ignorar qualquer erro que ocorra na sua aplicação. Isso permite que o teste continue mesmo que a página ainda não esteja totalmente carregada, dando tempo para que os elementos sejam renderizados antes que o Cypress tente interagir com eles.&lt;/p>
&lt;p>Por que remover &lt;code>cy.on('uncaught:exception')&lt;/code> é importante? Nesse caso, como está sendo manipulado o teste, forçando a “ignorar esse erro retornando que ele seja falso” é adicionado um falso positivo no nosso teste. Segue abaixo:&lt;/p>
&lt;p>
&lt;img src=".././assets/image/2024/login_com_sucesso.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;h2>Alternativas e soluções para lidar com o tempo de carregamento e evitar adicionar “falso positivo”&lt;span class="hx:absolute hx:-mt-20" id="alternativas-e-soluções-para-lidar-com-o-tempo-de-carregamento-e-evitar-adicionar-falso-positivo">&lt;/span>
&lt;a href="#alternativas-e-solu%c3%a7%c3%b5es-para-lidar-com-o-tempo-de-carregamento-e-evitar-adicionar-falso-positivo" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Em vez de suprimir erros, deve-se usar as ferramentas do Cypress para garantir que os elementos estejam presentes e prontos para interação antes de tentar acessá-los. Algumas opções incluem:&lt;/p>
&lt;p>&lt;code>cy.wait()&lt;/code>: Aguarde um determinado tempo ou até que um elemento ou condição específica seja atendida antes de prosseguir com o teste.&lt;/p>
&lt;p>OBS: cuide as más práticas ao usar o comando &lt;code>cy.wait(número)&lt;/code> , leia a documentação sobre Anti-Pattern.&lt;/p>
&lt;p>&lt;a href="https://docs.cypress.io/app/core-concepts/best-practices#Unnecessary-Waiting"target="_blank" rel="noopener">Unnecessary Waiting aqui&lt;/a>&lt;/p>
&lt;p>Em vez disso, use:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cy.intercept&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;GET&amp;#39;&lt;/span>, &lt;span class="s1">&amp;#39;/users&amp;#39;&lt;/span>, &lt;span class="o">[{&lt;/span> name: &lt;span class="s1">&amp;#39;Maggy&amp;#39;&lt;/span> &lt;span class="o">}&lt;/span>, &lt;span class="o">{&lt;/span> name: &lt;span class="s1">&amp;#39;Joan&amp;#39;&lt;/span> &lt;span class="o">}])&lt;/span>.as&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;getUsers&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cy.get&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;[data-testid=&amp;#34;fetch-users&amp;#34;]&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span>.click&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cy.wait&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;@getUsers&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span> // &amp;lt;--- &lt;span class="nb">wait&lt;/span> explicitly &lt;span class="k">for&lt;/span> this route to finish&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;code>cy.get(...).should('exist')&lt;/code> ou&lt;/p>
&lt;p>&lt;code>cy.get(...).should('be.visible')&lt;/code>&lt;/p>
&lt;p>Precisa garantir de que o elemento existe e está visível na página antes de tentar interagir com ele.&lt;/p></description></item></channel></rss>