<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Leandro Duarte</title>
    <description>The latest articles on DEV Community by Leandro Duarte (@ldnovaes).</description>
    <link>https://dev.to/ldnovaes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1055497%2Fb477e508-fa81-4ef3-a246-a21931da9549.jpeg</url>
      <title>DEV Community: Leandro Duarte</title>
      <link>https://dev.to/ldnovaes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ldnovaes"/>
    <language>en</language>
    <item>
      <title>Padrões de Projetos Comportamentais</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Wed, 26 Jul 2023 16:02:07 +0000</pubDate>
      <link>https://dev.to/ldnovaes/padroes-de-projetos-comportamentais-k48</link>
      <guid>https://dev.to/ldnovaes/padroes-de-projetos-comportamentais-k48</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Este artigo tem como propósito investigar os Padrões de Projeto Comportamentais, os quais podem ser aplicados em projetos de desenvolvimento de software. Tais padrões representam abordagens cientificamente fundamentadas para promover a implementação de códigos limpos, bem estruturados e de fácil compreensão. Além disso, abordaremos a relevância da reutilização de código como um dos principais objetivos decorrentes da adoção desses padrões. Demonstra-se que a aplicação de qualquer um desses padrões viabiliza a concepção de sistemas completos com maior eficiência, exigindo menos linhas de código e fomentando uma organização mais eficaz.&lt;/p&gt;

&lt;p&gt;Palavras-chave: Orientação a Objetos, Padrões de Projeto, GoF&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Cada profissional envolvido no desenvolvimento de softwares adota suas próprias abordagens para organizar e alcançar a finalização do produto desejado. No entanto, por trás desse processo, há uma relevante convenção respaldada pela comunidade internacional, a qual fornece diretrizes valiosas sobre a construção adequada de cada sistema. Ao acatar essas recomendações e adotar boas práticas, alcançaremos um nível de desenvolvimento em que nossos códigos se tornarão altamente reutilizáveis e facilmente compreensíveis.&lt;/p&gt;

&lt;p&gt;O principal objetivo da utilização desses padrões é, justamente, promover a organização em nossos projetos. Visto que nem sempre atuamos de forma isolada, uma excelente comunicação e organização são fundamentais para o sucesso de projetos em equipe. Ao adotar essas práticas, facilitamos a colaboração, possibilitando um ambiente propício para uma construção conjunta eficiente.&lt;/p&gt;

&lt;p&gt;Manutenções e adições são temidas por inúmeros desenvolvedores, uma vez que algo pequeno como a adição de um novo objeto ou edição do mesmo se torne um grande problema no futuro. Uma vez que será necessário mexer em dezenas de outros arquivos para algo que poderia ser feito com maior produtividade se houvessem boas práticas inseridas no projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os Padrões
&lt;/h2&gt;

&lt;p&gt;Existem diversas opções de padrões que podem e devem ser adotados pelos desenvolvedores. Neste tópico, serão abordados detalhadamente esses padrões, além de serem apresentados exemplos concretos de suas aplicações em projetos reais. É importante ressaltar que, de acordo com as particularidades de cada projeto, é necessário ajustar a lógica de implementação, uma vez que cada empreendimento possui necessidades e funcionalidades distintas.&lt;/p&gt;

&lt;p&gt;A aplicação de, pelo menos, um desses padrões durante o desenvolvimento possibilita prevenir futuras dores de cabeça. Ao escolher estrategicamente e adotar tais padrões, os desenvolvedores podem mitigar problemas potenciais e simplificar a manutenção do sistema no futuro. A reflexão acerca da escolha e implementação dessas práticas resultará em benefícios significativos para o sucesso do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais são?
&lt;/h2&gt;

&lt;p&gt;Teremos um post para cada um deles, mas os principais são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Padrão Strategy (Estratégia): Permite definir uma família de algoritmos, encapsular cada um deles e torná-los intercambiáveis. Isso permite que o cliente escolha o algoritmo a ser usado sem modificar o código do cliente.&lt;/li&gt;
&lt;li&gt;Padrão Observer (Observador): Define uma dependência um-para-muitos entre objetos, de modo que, quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente.&lt;/li&gt;
&lt;li&gt;Padrão Chain of Responsibility (Corrente de Responsabilidade): Permite que você envie uma solicitação ao longo de uma cadeia de objetos. Cada objeto na cadeia pode tratar a solicitação ou passá-la para o próximo objeto na cadeia.&lt;/li&gt;
&lt;li&gt;Padrão Command (Comando): Encapsula uma solicitação como um objeto, permitindo que você parametrize clientes com diferentes solicitações, enfileire ou registre solicitações e suporte operações reversíveis (desfazer).&lt;/li&gt;
&lt;li&gt;Padrão Template Method (Método Template): Define o esqueleto de um algoritmo em uma operação, mas permite que as subclasses redefinam etapas específicas desse algoritmo sem alterar sua estrutura.&lt;/li&gt;
&lt;li&gt;Padrão State (Estado): Permite que um objeto altere seu comportamento quando seu estado interno muda. Parece que o objeto mudou sua classe.&lt;/li&gt;
&lt;li&gt;Padrão Interpreter (Intérprete): Fornece uma maneira de avaliar a gramática ou expressão de uma linguagem.&lt;/li&gt;
&lt;li&gt;Padrão Visitor (Visitante): Permite adicionar novas operações a uma estrutura de objetos existente sem modificar essa estrutura.&lt;/li&gt;
&lt;li&gt;Padrão Mediator (Mediador): Define um objeto que centraliza a comunicação entre objetos em um sistema. Os objetos se comunicam por meio do mediador, em vez de se comunicarem diretamente entre si.&lt;/li&gt;
&lt;li&gt;Padrão Memento (Memorando): Permite que você capture e restaure o estado interno de um objeto sem expor sua estrutura interna.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Experimente meu game de Dragon Ball no Scratch</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Fri, 21 Jul 2023 14:09:21 +0000</pubDate>
      <link>https://dev.to/ldnovaes/experimente-meu-game-de-dragon-ball-no-scratch-45ec</link>
      <guid>https://dev.to/ldnovaes/experimente-meu-game-de-dragon-ball-no-scratch-45ec</guid>
      <description>&lt;p&gt;Experimente meu jogo feito dentro do scratch!&lt;/p&gt;

&lt;p&gt;Foi um projeto desenvolvido como tarefa para um curso na edX e gostaria de apresentar a vocês essa maravilha de projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5ZCUg2qI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9myz022ky7ewn756yc1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5ZCUg2qI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9myz022ky7ewn756yc1p.png" alt="Dragon Ball no Scratch" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ainda falta muita coisa, mas já dá pra notar que pode se tornar algo bem bacana no futuro. Vou adicionando outros recursos, personagens, assets com o passar do tempo e vou atualizando aqui dentro do &lt;code&gt;DEV&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Espero que goste da trilha sonora! &lt;del&gt;SINTA A NOSTALGIA&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Aqui está o link para jogarem:&lt;br&gt;
&lt;a href="https://scratch.mit.edu/projects/770653435/"&gt;https://scratch.mit.edu/projects/770653435/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E se você tiver algum feedback, deixe abaixo aqui. Caso queira contribuir de alguma maneira, basta entrar em contato comigo pelo email: &lt;a href="mailto:duartewgo@gmail.com"&gt;duartewgo@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado! &lt;del&gt;BRIGADUH!&lt;/del&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>scratch</category>
    </item>
    <item>
      <title>Discussão: Como você se vê no futuro?</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Thu, 20 Jul 2023 23:59:06 +0000</pubDate>
      <link>https://dev.to/ldnovaes/discussao-como-voce-se-ve-no-futuro-3l67</link>
      <guid>https://dev.to/ldnovaes/discussao-como-voce-se-ve-no-futuro-3l67</guid>
      <description>&lt;p&gt;Fala &lt;code&gt;devs&lt;/code&gt;, tudo bem? Hoje o post sai um pouco dos tradicionais tutoriais e vai para uma discussão bem séria.&lt;/p&gt;

&lt;p&gt;Essa pergunta é muito comum em entrevistas de empregos e normalmente sempre temos aquela resposta padrão de: quero crescer profissionalmente, quero aumentar minha "senioridade". &lt;/p&gt;

&lt;p&gt;Nesse post, não vale dar essas respostas clichês. Eu quero saber o que você realmente pensa sobre o seu futuro. Você tem algum objetivo? Se sim, compartilhe aí pra nós e diga os "passos" que você pretende dar para chegar nesse objetivo.. hahaha!&lt;/p&gt;

&lt;p&gt;Bora começar! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🐍 Práticas recomendadas para testes de unidade em Python 🧪</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Mon, 15 May 2023 14:06:05 +0000</pubDate>
      <link>https://dev.to/ldnovaes/praticas-recomendadas-para-testes-de-unidade-em-python-28hm</link>
      <guid>https://dev.to/ldnovaes/praticas-recomendadas-para-testes-de-unidade-em-python-28hm</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Os testes de unidade são uma parte essencial do processo de desenvolvimento de software, permitindo que os desenvolvedores verifiquem se suas unidades de código (funções, classes, métodos) estão funcionando corretamente. Em Python, existem várias práticas recomendadas que podem melhorar a eficácia e a qualidade dos testes de unidade. Aqui estão exemplificada as 5 primeiras. O restante irei apenas citar, mas é importante que você possa procurar sobre o assunto em outras fontes.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ - Estrutura de Testes
&lt;/h2&gt;

&lt;p&gt;Python oferece diversas bibliotecas populares para testes de unidade, como o unittest, pytest e nose. Essas estruturas fornecem uma série de recursos úteis, como assertivas, fixtures e relatórios de testes.&lt;/p&gt;

&lt;p&gt;A seguir um exemplo com &lt;code&gt;pytest&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# test_calculadora.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_soma&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_soma_negativos&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos um módulo chamado &lt;code&gt;test_calculadora.py&lt;/code&gt; que contém duas funções de teste: &lt;code&gt;test_soma()&lt;/code&gt; e &lt;code&gt;test_soma_negativos()&lt;/code&gt;. Essas funções são identificadas pelo prefixo "test_" e serão reconhecidas e executadas pelo pytest.&lt;/p&gt;

&lt;p&gt;Cada função de teste contém uma ou mais assertivas, que verificam se os resultados da função soma() estão corretos. Se todas as assertivas passarem, o teste é considerado bem-sucedido. Caso contrário, uma falha será relatada, indicando que algo está errado no código.&lt;/p&gt;

&lt;p&gt;Para executar esses testes, você precisa ter o pytest instalado em seu ambiente. Em seguida, você pode executar o pytest no diretório que contém o arquivo de teste. O pytest encontrará automaticamente todas as funções de teste e as executará:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O pytest fornecerá um relatório de execução dos testes, indicando quais testes passaram e quais falharam.&lt;/p&gt;

&lt;p&gt;Essa é apenas uma pequena amostra do uso da biblioteca pytest para testes de unidade em Python. Ela oferece muitos recursos adicionais, como fixtures (para configurações pré e pós-teste), parâmetros de teste parametrizados, captura de exceções esperadas e muito mais. Com o pytest, você pode escrever testes concisos, legíveis e eficazes para garantir a qualidade do seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ - Testes Independentes
&lt;/h2&gt;

&lt;p&gt;Cada teste deve ser independente e não depender do resultado de outros testes. Isso ajuda a isolar problemas e torna os testes mais confiáveis.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo que demonstra a escrita de testes independentes usando a biblioteca unittest em Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestCalculadora&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_soma_positivos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_soma_negativos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_soma_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma classe de teste chamada TestCalculadora, que herda da classe &lt;code&gt;unittest.TestCase&lt;/code&gt;. Dentro dessa classe, temos três métodos de teste: &lt;code&gt;test_soma_positivos()&lt;/code&gt;, &lt;code&gt;test_soma_negativos()&lt;/code&gt; e &lt;code&gt;test_soma_zero()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cada método de teste é independente e não depende dos resultados de outros testes. Cada um deles chama a função &lt;code&gt;soma()&lt;/code&gt; com diferentes argumentos e verifica se o resultado é o esperado usando a assertiva &lt;code&gt;self.assertEqual()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para executar esses testes usando a estrutura de testes unittest, você pode criar um arquivo separado com o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;

&lt;span class="c1"&gt;# Importe a classe de teste
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;test_calculadora&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestCalculadora&lt;/span&gt;

&lt;span class="c1"&gt;# Carregue os testes da classe
&lt;/span&gt;&lt;span class="n"&gt;suite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestLoader&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;loadTestsFromTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCalculadora&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Crie um TestRunner
&lt;/span&gt;&lt;span class="n"&gt;runner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextTestRunner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Execute os testes
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;runner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar esse arquivo, você verá o resultado dos testes, indicando se cada um passou ou falhou. Cada teste é executado de forma independente, garantindo que problemas em um teste não afetem os resultados dos outros testes.&lt;/p&gt;

&lt;p&gt;Ao escrever testes independentes, você pode ter confiança de que cada teste está sendo executado em um contexto isolado, o que torna os testes mais confiáveis e facilita a identificação e correção de problemas específicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ - Nome descritivos aos testes
&lt;/h3&gt;

&lt;p&gt;Escolha nomes significativos para seus testes, descrevendo o comportamento que eles estão testando. Isso facilita a identificação de problemas quando os testes falham e ajuda a documentar a intenção do teste.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo que ilustra a escolha de nomes significativos para os testes, descrevendo o comportamento que eles estão testando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestCalculadora&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adicionar_numeros_positivos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adicionar_numeros_negativos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adicionar_numero_positivo_e_negativo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma classe de teste chamada &lt;code&gt;TestCalculadora&lt;/code&gt; que contém três métodos de teste: &lt;code&gt;test_adicionar_numeros_positivos()&lt;/code&gt;, &lt;code&gt;test_adicionar_numeros_negativos()&lt;/code&gt; e &lt;code&gt;test_adicionar_numero_positivo_e_negativo()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cada método de teste possui um nome descritivo que indica claramente o comportamento sendo testado. Por exemplo, o método &lt;code&gt;test_adicionar_numeros_positivos()&lt;/code&gt; verifica se a função &lt;code&gt;adicionar()&lt;/code&gt; retorna o resultado correto ao adicionar dois números positivos. Da mesma forma, os outros métodos de teste descrevem o comportamento específico sendo testado.&lt;/p&gt;

&lt;p&gt;Ao escolher nomes significativos para os testes, fica mais fácil identificar qual aspecto do código está sendo testado quando ocorre uma falha. Além disso, esses nomes ajudam a documentar a intenção do teste, permitindo que outros desenvolvedores compreendam rapidamente o que está sendo testado e qual é o resultado esperado.&lt;/p&gt;

&lt;p&gt;Isso torna os testes mais legíveis, facilita a manutenção e melhora a clareza da documentação associada aos testes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4️⃣ - Use mocks e stubs
&lt;/h2&gt;

&lt;p&gt;Quando um código depende de recursos externos, como bancos de dados ou APIs, é recomendado o uso de mocks ou stubs para simular essas dependências durante os testes. Isso torna os testes mais rápidos e independentes de fatores externos.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo que demonstra o uso de mocks para simular uma dependência externa durante os testes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;unittest.mock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MagicMock&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;API&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Lógica para obter dados de uma API externa
&lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;processar_dados_da_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# Lógica para processar os dados recebidos da API
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestProcessamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_processar_dados_da_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Criação do mock da API
&lt;/span&gt;        &lt;span class="n"&gt;mock_api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MagicMock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;mock_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'valor'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Execução do código que depende da API
&lt;/span&gt;        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processar_dados_da_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Verificação do resultado
&lt;/span&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'valor'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma classe API que representa uma dependência externa, como uma API que retorna dados. Em seguida, temos uma função &lt;code&gt;processar_dados_da_api()&lt;/code&gt; que depende dessa API para obter e processar os dados.&lt;/p&gt;

&lt;p&gt;Durante o teste, criamos um mock da classe API usando &lt;code&gt;MagicMock&lt;/code&gt; da biblioteca &lt;code&gt;unittest.mock&lt;/code&gt;. Configuramos o retorno do método &lt;code&gt;get_data()&lt;/code&gt; do mock para simular os dados que seriam obtidos da API real.&lt;/p&gt;

&lt;p&gt;Ao chamar a função &lt;code&gt;processar_dados_da_api()&lt;/code&gt; com o mock da API, estamos simulando o comportamento da dependência externa durante o teste, sem precisar realmente fazer uma chamada à API real. Isso torna o teste mais rápido, independente de recursos externos e não está sujeito a falhas ou variações externas.&lt;/p&gt;

&lt;p&gt;Em seguida, podemos verificar se o resultado do processamento está correto usando as assertivas apropriadas, como &lt;code&gt;self.assertEqual()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O uso de mocks ou stubs para simular dependências externas é uma prática recomendada ao testar código que depende de recursos externos, como bancos de dados, APIs, serviços web, entre outros. Isso permite que você isole o código que está sendo testado e torne os testes mais rápidos, previsíveis e independentes de fatores externos.&lt;/p&gt;

&lt;h2&gt;
  
  
  5️⃣ - Cubra diferentes casos de teste
&lt;/h2&gt;

&lt;p&gt;Cubra diferentes casos de teste: Certifique-se de criar casos de teste que cubram todas as ramificações do código, incluindo casos de teste positivos e negativos. Isso ajuda a identificar erros e aumenta a confiabilidade do código testado.&lt;/p&gt;

&lt;p&gt;Aqui está outro exemplo que demonstra a cobertura de diferentes casos de teste, incluindo casos positivos e negativos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validar_idade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A idade não pode ser negativa"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Menor de idade"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Maior de idade"&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestValidacaoIdade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_idade_positiva_menor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validar_idade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Menor de idade"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_idade_positiva_maior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validar_idade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Maior de idade"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_idade_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validar_idade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Menor de idade"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_idade_negativa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertRaises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;validar_idade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma função validar_idade() que recebe uma idade como parâmetro e retorna uma string indicando se a idade é "Menor de idade" ou "Maior de idade". Ela inclui verificações para lidar com idades negativas.&lt;/p&gt;

&lt;p&gt;A classe de teste TestValidacaoIdade contém quatro métodos de teste diferentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;test_idade_positiva_menor()&lt;/code&gt; verifica se a função &lt;code&gt;validar_idade()&lt;/code&gt; retorna corretamente "Menor de idade" para uma idade positiva abaixo de 18.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;test_idade_positiva_maior()&lt;/code&gt; verifica se a função &lt;code&gt;validar_idade()&lt;/code&gt; retorna corretamente "Maior de idade" para uma idade positiva igual ou acima de 18.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;test_idade_zero()&lt;/code&gt; verifica se a função &lt;code&gt;validar_idade()&lt;/code&gt; retorna corretamente "Menor de idade" para uma idade igual a zero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;test_idade_negativa()&lt;/code&gt; verifica se a função &lt;code&gt;validar_idade()&lt;/code&gt; lança corretamente uma exceção ValueError ao receber uma idade negativa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses casos de teste cobrem diferentes cenários relacionados à validação da idade. Eles incluem idades positivas menores e maiores de 18, além de abordar os casos de idade igual a zero e idades negativas.&lt;/p&gt;

&lt;p&gt;Ao criar casos de teste que abrangem essas ramificações do código, podemos identificar possíveis erros e garantir que o código seja confiável em diferentes cenários. Isso aumenta a cobertura de testes e a confiabilidade do código testado.&lt;/p&gt;

&lt;h2&gt;
  
  
  6️⃣ - Automatize os testes:
&lt;/h2&gt;

&lt;p&gt;Integre os testes de unidade em um pipeline de integração contínua (CI) para garantir que eles sejam executados regularmente. Isso ajuda a detectar problemas rapidamente e a evitar regressões no código.&lt;/p&gt;

&lt;h2&gt;
  
  
  7️⃣ - Aplique o princípio do "AAA":
&lt;/h2&gt;

&lt;p&gt;A estrutura de teste deve seguir o padrão "Arrange, Act, Assert" (Preparar, Agir, Verificar). Na seção "Arrange", defina o ambiente de teste e configure os objetos necessários. Na seção "Act", invoque o código a ser testado. E na seção "Assert", verifique se o resultado está correto.&lt;/p&gt;

&lt;h2&gt;
  
  
  8️⃣ - Aproveite os recursos de assertivas:
&lt;/h2&gt;

&lt;p&gt;Utilize as assertivas fornecidas pela estrutura de testes para verificar se os resultados são os esperados. Isso inclui assertivas de igualdade, exceções lançadas, presença de elementos em listas, entre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  9️⃣ - Execute testes de forma rápida e frequente:
&lt;/h2&gt;

&lt;p&gt;É importante executar os testes de unidade com frequência, preferencialmente após cada alteração no código. Isso ajuda a identificar problemas o mais cedo possível e a manter a confiabilidade do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔟 - Mantenha uma cobertura de testes adequada:
&lt;/h2&gt;

&lt;p&gt;Acompanhe a cobertura dos testes para garantir que seu código esteja adequadamente testado. Existem ferramentas, como o &lt;code&gt;coverage&lt;/code&gt;, que podem ajudar a medir a cobertura do código testado. Busque manter uma cobertura abrangente, cobrindo o máximo possível do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣1️⃣ - Refatore os testes conforme necessário:
&lt;/h2&gt;

&lt;p&gt;À medida que o código evolui, os testes também devem ser atualizados. Se ocorrerem mudanças significativas no código, verifique se os testes ainda são relevantes e os atualize, se necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣2️⃣ - Documente seus testes:
&lt;/h2&gt;

&lt;p&gt;É útil fornecer uma documentação clara dos testes de unidade. Descreva o propósito de cada teste, os casos de teste cobertos e as expectativas de resultados. Isso facilita a compreensão e a manutenção dos testes no futuro.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣3️⃣ - Compartilhe seus testes:
&lt;/h2&gt;

&lt;p&gt;Se você está trabalhando em um projeto de código aberto ou em equipe, compartilhar seus testes é uma prática recomendada. Isso permite que outros desenvolvedores vejam como usar sua funcionalidade e possam contribuir com melhorias ou correções.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣4️⃣ - Execute testes em diferentes ambientes:
&lt;/h2&gt;

&lt;p&gt;Considere a execução de testes de unidade em diferentes ambientes, como diferentes sistemas operacionais ou versões do Python, para garantir a portabilidade e a compatibilidade do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣5️⃣ - Utilize ferramentas de análise estática:
&lt;/h2&gt;

&lt;p&gt;Além dos testes de unidade, considere o uso de ferramentas de análise estática de código, como o pylint ou flake8, para identificar possíveis problemas ou más práticas no código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Lembre-se de que os testes de unidade são apenas uma parte do processo de garantia de qualidade de software. É importante complementá-los com outros tipos de testes, como testes de integração e testes de aceitação, para obter uma cobertura abrangente e confiável do código.&lt;/p&gt;

&lt;p&gt;Ao seguir essas práticas recomendadas, você estará no caminho certo para escrever testes de unidade eficientes e de alta qualidade em Python. Eles ajudarão a melhorar a robustez do seu código, facilitarão a manutenção e aumentarão a confiança na funcionalidade do software desenvolvido.&lt;/p&gt;

</description>
      <category>python</category>
      <category>testing</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Hello World com Django</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Fri, 12 May 2023 13:58:24 +0000</pubDate>
      <link>https://dev.to/ldnovaes/hello-world-com-django-5a58</link>
      <guid>https://dev.to/ldnovaes/hello-world-com-django-5a58</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Eu sei que você já ouviu falar desse belíssimo framework e tenha tido no mínimo uma &lt;code&gt;curiosidadezinha&lt;/code&gt; para entender como ele realmente funciona. Nesse post nós iremos partir do absoluto &lt;strong&gt;ZERO&lt;/strong&gt;. &lt;/p&gt;

&lt;h1&gt;
  
  
  Requisitos
&lt;/h1&gt;

&lt;p&gt;Definiremos os requisitos, mas antes de você começar a suar as mãos achando que talvez você não seja apto, calma! Os requisitos são para o seu computador e ambiente de desenvolvimento!&lt;/p&gt;

&lt;h3&gt;
  
  
  1º Preparar nosso ambiente de desenvolvimento:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aqui nós simplesmente vamos fazer o que 
normalmente fazemos em cada projeto Python! 
Vamos criar um diretório principal e 
criarmos o nosso Ambiente Virtual. Para 
isso, esteja no diretório que você quer 
iniciar o seu projeto e no terminal digite:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, basta dar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Linux&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Windows&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ps1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2º Instalar o Django nesse novo Ambiente Virtual
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aqui nós iremos fazer a instalação de django através do gerenciador de pacotes do python &lt;code&gt;pip&lt;/code&gt;. Basta digitarmos no terminal:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3º Iniciarmos um Projeto Django
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vamos então dar inicio ao nosso novo projeto em Django, o primeiro de muitos! Basta no mesmo terminal digitar:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="n"&gt;startproject&lt;/span&gt; &lt;span class="n"&gt;nome_do_projeto&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, o Django deve ter criado uma estrutura parecida com essa abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nome_do_projeto&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;asgi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E você está a um passo de dar início ao desenvolvimento Web, mas ainda temos algumas pendências, configurações que precisamos fazer.&lt;/p&gt;

&lt;h1&gt;
  
  
  Iniciando o primeiro Aplicativo
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Espera, mas nós já não tínhamos feito o nosso aplicativo no passo anterior?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na verdade &lt;code&gt;não&lt;/code&gt;! O que nós fizemos anteriormente é a criação de um projeto. Um projeto em Django nada mais é do que um amontoado de configurações e aplicativo. Entenda que com Django você pode ter várias aplicações rodando em um mesmo projeto e essa é a beleza da coisa! Na própria documentação do Django há essa explicação e eu vou deixá-la para que você possa entender melhor!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//Um%20aplicativo%20%C3%A9%20um%20aplicativo%20da%20web%20que%20faz%20algo%20%E2%80%93%20por%20exemplo,%20um%20sistema%20de%20blog,%20um%20banco%20de%20dados%20de%20registros%20p%C3%BAblicos%20ou%20um%20pequeno%20aplicativo%20de%20pesquisa.%20Um%20projeto%20%C3%A9%20uma%20cole%C3%A7%C3%A3o%20de%20configura%C3%A7%C3%B5es%20e%20aplicativos%20para%20um%20determinado%20site.%20Um%20projeto%20pode%20conter%20v%C3%A1rios%20aplicativos.%20Um%20aplicativo%20pode%20estar%20em%20v%C3%A1rios%20projetos."&gt;Diferença entre app x projeto -&amp;gt; &lt;/a&gt;Qual é a diferença entre um projeto e um aplicativo? Um aplicativo é um aplicativo da web que faz algo – por exemplo, um sistema de blog, um banco de dados de registros públicos ou um pequeno aplicativo de pesquisa. Um projeto é uma coleção de configurações e aplicativos para um determinado site. Um projeto pode conter vários aplicativos. Um aplicativo pode estar em vários projetos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora que estamos entendido entre a diferença de app x projeto nós iremos então finalmente dar inicio a nossa aplicação. Precisamos entender que nossa aplicação tem que possuir um diretório no mesmo local que o arquivo &lt;code&gt;manage.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;startapp&lt;/span&gt; &lt;span class="n"&gt;nome_app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito o comando agora nós temos algo bem interessante aqui. Temos uma estrutura completa de um projeto e outra estrutura completa de nosso aplicativo. A documentação recomenda alguns passos antes de fazer o que iremos. Mas eu acredito que seja fundamental que a cada novo aplicativo você faça isso. Vá para a pasta do seu &lt;code&gt;nome_do_projeto/settings.py&lt;/code&gt; e procure pela variável &lt;code&gt;INSTALLED_APPS&lt;/code&gt;. Nela você vai adicionar a seguinte &lt;code&gt;str&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"**nome_app**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'django.contrib.admin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora fizemos então a integração do nosso app ao nosso projeto! Quero que toda vez que você dar um &lt;code&gt;startapp&lt;/code&gt; você volte e faça isso!&lt;/p&gt;

&lt;h1&gt;
  
  
  Criando a primeira view
&lt;/h1&gt;

&lt;p&gt;É importante entendermos que cada URL que o usuário acessar ele precisa ver algo não é? Talvez apresentar uma imagem, um post de blog ou quem sabe nós queiramos apenas deixar uma mensagem para algum visitante daquela URL. Na view, nós vamos definir o que acontecerá quando o usuário acessar uma determinada URL. Aqui eu não quero que você se preocupe em como será a sua URL, apenas no que aparecerá ao usuário.&lt;/p&gt;

&lt;p&gt;Partindo dessa lógica, vamos abrir o arquivo &lt;code&gt;nome_app/views.py&lt;/code&gt; e vamos criar fazer o seguinte import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.shortcuts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E logo em seguida vamos criar uma função chamada index que vai retornar um HttpResponse&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, Mundo!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, criamos nossa view! E agora, como eu consigo que meu usuário veja essa view?&lt;/p&gt;

&lt;h1&gt;
  
  
  Criando URLs dos aplicativos e das views
&lt;/h1&gt;

&lt;p&gt;Aqui há um ponto muito importante a ser feito! É a criação das nossas URLS e você precisa separar esse processo em duas etapas:&lt;/p&gt;

&lt;h3&gt;
  
  
  1º Criando a URL do nosso app
&lt;/h3&gt;

&lt;p&gt;Cada app precisa ter uma url própria! E para isso precisamos ir em &lt;code&gt;nome_do_projeto/urls.py&lt;/code&gt; e inserir dois novos elemento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.urls&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'admin/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nome_app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nome_app.urls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"nome_app"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso nós fizemos a integração do nosso aplicativo ao nosso projeto e agora todas as urls de nosso aplicativo terão um &lt;code&gt;.../nome_app/...&lt;/code&gt;. Isso é importante tendo em vista que nós queremos que cada aplicativo seja único e diferenciável! Isso ajuda até mesmo no clean code e futuros debugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2º Criando a URL para nossa primeira view
&lt;/h3&gt;

&lt;p&gt;Lembra que nós criamos a primeira view mas eu te pedi para não se preocupar em como o usuário acessasse aquela view? Agora eu vou te pedir o oposto! Vamos criar então um endereço único para essa view a fim de aprendizagem, e claro, para que você possa realmente dizer: &lt;strong&gt;EU CRIEI O MEU PRIMEIRO SITE COM DJANGO&lt;/strong&gt;. Para isso, basta criar um arquivo na raiz do seu nome_app chamado &lt;code&gt;urls.py&lt;/code&gt;. Dentro do seu arquivo escreva:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.urls&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;

&lt;span class="n"&gt;app_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nome_app"&lt;/span&gt;

&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/index"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora pronto! Tudo conectado e perfeitamente solidificado! Você criou o seu primeiro site com Django e tem uma rota única para acessar um &lt;code&gt;Olá Mundo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Basta digitar no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;runserver&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, clique no link gerado pelo seu terminal e acrescente:&lt;/p&gt;

&lt;p&gt;Ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nome_app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foi capaz de ver o seu Hello World? Então meus parabéns! Daqui para frente, você só tem a crescer! Há muito mais coisas e possibilidades que você pode e deve fazer! Mas eu espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Se quer mais tutoriais básicos ou até mesmo avançados, deixe seu comentário que podemos prosseguir com o nosso projeto e quem sabe criar uma grande aplicação com Django!&lt;/p&gt;

&lt;h1&gt;
  
  
  Até logo!!!!!!
&lt;/h1&gt;

</description>
      <category>python</category>
      <category>django</category>
    </item>
    <item>
      <title>Como fazer upload de fotos de perfil de usuários do seu app Flask para um serviço de hospedagem gratuito</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Mon, 10 Apr 2023 19:48:10 +0000</pubDate>
      <link>https://dev.to/ldnovaes/como-fazer-upload-de-fotos-de-perfil-de-usuarios-do-seu-app-flask-para-um-servico-de-hospedagem-gratuito-pkn</link>
      <guid>https://dev.to/ldnovaes/como-fazer-upload-de-fotos-de-perfil-de-usuarios-do-seu-app-flask-para-um-servico-de-hospedagem-gratuito-pkn</guid>
      <description>&lt;p&gt;Em muitos aplicativos web, é comum permitir que os usuários carreguem fotos de perfil. No entanto, armazenar essas fotos em um servidor pode consumir muito espaço de armazenamento e pode ser lento para os usuários carregarem. É por isso que muitos desenvolvedores optam por fazer o upload dessas fotos diretamente para a nuvem.&lt;/p&gt;

&lt;p&gt;Neste post, vou explicar como você pode usar o Cloudinary para fazer o upload de fotos de perfil do usuário do Flask diretamente para a nuvem. Você também aprenderá como salvar a URL da imagem do Cloudinary em uma coluna chamada "foto de perfil" na tabela do usuário.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 1: Configurar o Cloudinary
&lt;/h4&gt;

&lt;p&gt;A primeira coisa que você precisa fazer é se inscrever no Cloudinary e configurá-lo para o seu aplicativo. Depois de se inscrever, você receberá um nome de usuário, uma chave de API e uma chave secreta que você usará para autenticar suas solicitações de upload.&lt;/p&gt;

&lt;p&gt;Mas calma, faremos isso passo a passo para que você entenda!&lt;/p&gt;

&lt;p&gt;Primeiro, como supracitado criaremos a nossa conta no site da Cloudinary &lt;a href="https://cloudinary.com/users/register_free"&gt;clicando aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pGDwRv2a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j9f3op8y16im44qpx4ij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pGDwRv2a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j9f3op8y16im44qpx4ij.png" alt="Criando conta no Cloudinary" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora é com você! Crie sua conta conforme a sua necessidade. Eu, pelo menos, usei o meu GitHub para tal e achei que foi uma decisão sábia, uma vez que economizei tempo! &lt;del&gt;E tempo é dinheiro emmm&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Feita a sua conta, deixe a primeira tela lá! Ela é importante, mas nós faremos outro processo aqui: &lt;strong&gt;a instalação do Cloudinary no seu aplicativo Python!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para instalar a biblioteca Python do Cloudinary, você pode usar o seguinte comando no terminal do seu aplciativo (Lembre-se de estar no mesmo venv do seu aplicativo!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que você realizou os processos acima, criaremos um arquivo na raiz do seu projeto Flask chamado &lt;code&gt;config.py&lt;/code&gt;. Nele, colocaremos exatamente isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cloudinary&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cloudinary.uploader&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cloudinary.api&lt;/span&gt;

&lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;cloud_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"you_cloud_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"you_api_key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;api_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"you_api_secret"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde estiver &lt;code&gt;you_*&lt;/code&gt;, você substituirá pelos dados que obteve na criação da sua conta no Cloudinary. Esses dados estão exatamente como no print abaixo. &lt;del&gt;E é claro que os meus você não irá ver haha!&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UT4FCrzm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lh42inga7x390oynbgz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UT4FCrzm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lh42inga7x390oynbgz3.png" alt="Obtendo seus dados do Cloudinary" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora falta bem pouquinho para você integrar de vez a sua nuvem do Cloudinary ao seu aplicativo Flask! No arquivo onde estão suas rotas, você fará as seguintes importações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cloudinary&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, o seu aplicativo está totalmente integrado! Agora é só você fazer o upload das fotos dos seus usuários para a nuvem! E fazer isso é extremamente simples! Supondo que você já tenha uma coluna no seu banco de dados assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;foto_perfil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na sua rota em que o usuário modifica a foto dele, você deve fazer algo parecido com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# upa a foto para o cloudinary
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;foto_perfil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# muda a coluna foto_perfil do usuario
&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;foto_perfil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'public_id'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sim, isso mesmo! Dessa forma, o Cloudinary irá definir um nome para a imagem (sem repetir algum já existente) e você irá integrar esse nome na coluna &lt;code&gt;foto_perfil&lt;/code&gt; do usuário. &lt;/p&gt;

&lt;p&gt;E para chamar essa imagem é algo extremamente simples. No HTML, basta você fazer algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"{{ 'https://res.cloudinary.com/dsfomdqni/image/upload/' ~ usuario.foto_perfil }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  OBSERVAÇÃO
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Lembrando que usei algumas variáveis aqui que podem estar diferentes para o seu projeto. &lt;code&gt;usuario&lt;/code&gt; e &lt;code&gt;foto_perfil&lt;/code&gt; podem estar diferente para você! Cabe a você a transformação dessas variáveis de acordo com o seu projeto! Eu estou aqui para ajudar e contribuir, caso você ainda tenha dificuldades para essa integração, basta comentar abaixo que eu irei te ajudar&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Bônus
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Eu suponho que você queira ter uma foto como &lt;code&gt;default&lt;/code&gt; no seu sistema! &lt;del&gt;Para aqueles usuarios chatos que não trocam a foto de perfil&lt;/del&gt; Para usuários que não usam foto de perfil! Faça upload de uma foto padrão para o Cloudinary e a nomeie como &lt;code&gt;default&lt;/code&gt;. E deixe para que toda vez que um usuário for criado seja dado um valor a coluna foto_perfil chamado &lt;code&gt;default&lt;/code&gt;. A foto que você pode usar como default pode ser essa abaixo!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uabh_RMi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmibufn3xs4luhog92lu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uabh_RMi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmibufn3xs4luhog92lu.png" alt="Foto de Perfil Default" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você usa o FlaskSQL Alchemy basta ter no seu arquivo de &lt;code&gt;models&lt;/code&gt; algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;foto_perfil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"default.png"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>cloudinary</category>
      <category>flask</category>
      <category>python</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Independência tecnológica: Por que o Brasil precisa urgentemente de seu próprio sistema operacional baseado em Linux?</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Sun, 09 Apr 2023 13:40:15 +0000</pubDate>
      <link>https://dev.to/ldnovaes/independencia-tecnologica-por-que-o-brasil-precisa-urgentemente-de-seu-proprio-sistema-operacional-baseado-em-linux-2d2m</link>
      <guid>https://dev.to/ldnovaes/independencia-tecnologica-por-que-o-brasil-precisa-urgentemente-de-seu-proprio-sistema-operacional-baseado-em-linux-2d2m</guid>
      <description>&lt;p&gt;Recentemente, conheci a distribuição Linux HarmoniKR OS, desenvolvida na Coreia do Sul e baseada no Linux Mint. Essa descoberta me levou a questionar a possibilidade de o Brasil ter seu próprio sistema operacional reconhecido e incentivado pelo governo.&lt;/p&gt;

&lt;p&gt;Desenvolver um sistema operacional próprio seria uma iniciativa importante para o país, tornando-o mais independente de tecnologias e avanços externos. Além disso, permitiria reduzir os custos de licenciamento, uma vez que estaríamos falando de sistemas open source, que em sua maioria são gratuitos.&lt;/p&gt;

&lt;p&gt;Países interessados em manter a autonomia tecnológica e evitar a dependência de softwares comerciais desenvolvidos fora de suas fronteiras utilizam sistemas abertos ou versões compatíveis desenvolvidas autonomamente. A China desenvolveu o Kylin OS, e a Rússia criou o Astra Linux, ambos baseados no Linux e reconhecidos pelos governos locais.&lt;/p&gt;

&lt;p&gt;Adotar uma versão própria de sistema operacional a partir de uma distribuição Linux permitiria ao Brasil superar a desconfiança existente em relação à existência de backdoors criados por serviços de inteligência estrangeiros nos softwares produzidos em seus países de origem. Além disso, essa iniciativa estaria alinhada com a Estratégia Nacional de Defesa, permitindo a aquisição de tecnologia de uso dual pela indústria nacional.&lt;/p&gt;

&lt;p&gt;Em resumo, a iniciativa de criar um sistema operacional brasileiro baseado em Linux pode ser extremamente importante para o país. Isso garantiria a autonomia tecnológica, reduziria os custos de licenciamento e estaria alinhada com a Estratégia Nacional de Defesa. O Brasil tem um grande potencial para se tornar um líder tecnológico na região, e o desenvolvimento de um sistema operacional próprio seria um passo significativo nessa direção.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bônus:&lt;/strong&gt; Quem sabe o nome poderia ser Amazônia OS ou quem sabe um Tupi OS haha!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como utilizar o Python para análise de dados</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Thu, 06 Apr 2023 14:11:22 +0000</pubDate>
      <link>https://dev.to/ldnovaes/como-utilizar-o-python-para-analise-de-dados-1gie</link>
      <guid>https://dev.to/ldnovaes/como-utilizar-o-python-para-analise-de-dados-1gie</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PSyL1Qck--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/python-3670A0%3Fstyle%3Dfor-the-badge%26logo%3Dpython%26logoColor%3Dffdd54" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PSyL1Qck--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/python-3670A0%3Fstyle%3Dfor-the-badge%26logo%3Dpython%26logoColor%3Dffdd54" alt="Python" width="98" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você está interessado em análise de dados, uma das ferramentas mais populares para realizar essa tarefa é o Python. Com a sua sintaxe simples e grande variedade de bibliotecas, o Python se tornou uma das linguagens mais utilizadas na análise de dados em todo o mundo. Neste artigo, vamos dar uma olhada em algumas das bibliotecas mais utilizadas no Python para análise de dados e como utilizá-las.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hSR7Amai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/pandas-%2523150458.svg%3Fstyle%3Dfor-the-badge%26logo%3Dpandas%26logoColor%3Dwhite" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hSR7Amai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/pandas-%2523150458.svg%3Fstyle%3Dfor-the-badge%26logo%3Dpandas%26logoColor%3Dwhite" alt="Pandas" width="98" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Pandas é uma biblioteca popular para a análise de dados em Python. Ele oferece várias ferramentas de manipulação de dados, como filtragem, agregação e transformação, além de permitir a importação de dados de várias fontes. O Pandas também oferece funcionalidades para visualização de dados e para a manipulação de séries temporais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X3o9oWhh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/Matplotlib-%2523ffffff.svg%3Fstyle%3Dfor-the-badge%26logo%3DMatplotlib%26logoColor%3Dblack" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X3o9oWhh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/Matplotlib-%2523ffffff.svg%3Fstyle%3Dfor-the-badge%26logo%3DMatplotlib%26logoColor%3Dblack" alt="Matplotlib" width="109" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Matplotlib é uma biblioteca de visualização de dados em Python. Ele permite a criação de gráficos de linha, barras, dispersão e muitos outros tipos de gráficos. O Matplotlib é altamente personalizável e permite que você controle muitos aspectos do gráfico, incluindo títulos, legendas, cores e fontes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DKPNg3LU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/numpy-%2523013243.svg%3Fstyle%3Dfor-the-badge%26logo%3Dnumpy%26logoColor%3Dwhite" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DKPNg3LU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/numpy-%2523013243.svg%3Fstyle%3Dfor-the-badge%26logo%3Dnumpy%26logoColor%3Dwhite" alt="NumPy" width="90" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O NumPy é uma biblioteca para computação científica em Python. Ele oferece funcionalidades para trabalhar com arrays multidimensionais e para realizar operações matemáticas em grandes conjuntos de dados. O NumPy é amplamente utilizado na análise de dados e em outras áreas da ciência de dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ByyjRvWo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/scikit--learn-%2523F7931E.svg%3Fstyle%3Dfor-the-badge%26logo%3Dscikit-learn%26logoColor%3Dwhite" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ByyjRvWo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/scikit--learn-%2523F7931E.svg%3Fstyle%3Dfor-the-badge%26logo%3Dscikit-learn%26logoColor%3Dwhite" alt="scikit-learn" width="140" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Scikit-learn é uma biblioteca para aprendizado de máquina em Python. Ele oferece vários algoritmos de aprendizado de máquina, como regressão linear, regressão logística e árvores de decisão. O Scikit-learn também oferece funcionalidades para pré-processamento de dados e avaliação de modelos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/seaborn/seaborn"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3W7KlMd8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/Seaborn-0.11.1-orange" alt="Seaborn" width="100" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Seaborn é uma biblioteca de visualização de dados em Python. Ele oferece uma interface mais simples do que o Matplotlib para a criação de gráficos estatísticos avançados, como gráficos de distribuição, gráficos de densidade e gráficos de correlação. O Seaborn também é altamente personalizável e permite que você controle muitos aspectos do gráfico.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O Python oferece uma grande variedade de bibliotecas para análise de dados e é uma das linguagens mais populares para essa tarefa. O Pandas, o Matplotlib, o NumPy, o Scikit-learn e o Seaborn são apenas algumas das bibliotecas disponíveis. Com essas ferramentas em mãos, você estará bem equipado para realizar análises de dados avançadas em Python.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Bônus
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PeF3px67--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/jupyter-%2523FA0F00.svg%3Fstyle%3Dfor-the-badge%26logo%3Djupyter%26logoColor%3Dwhite" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PeF3px67--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/badge/jupyter-%2523FA0F00.svg%3Fstyle%3Dfor-the-badge%26logo%3Djupyter%26logoColor%3Dwhite" alt="Jupyter Notebook" width="102" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como bônus, vou falar sobre uma ferramenta que é simplesmente incrível para análises de dados em Python: o Jupyter. Ele é capaz de unir código, texto e visualizações em um único local, tornando a apresentação de dados muito mais fácil e interativa. Com o Jupyter, é possível criar notebooks que contêm o código para a análise de dados, juntamente com textos explicativos e visualizações dos resultados. Isso torna mais fácil para outras pessoas entenderem e reproduzirem o trabalho. Além disso, o Jupyter oferece funcionalidades para testar e depurar o código diretamente no notebook, permitindo experimentar diferentes abordagens de análise de dados. É realmente uma ferramenta indispensável para qualquer pessoa que trabalha com análise de dados em Python. Então, se você quiser impressionar seus clientes ou empregadores com apresentações incríveis de dados, o Jupyter é a escolha certa!&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como melhorar a legibilidade do código</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Mon, 03 Apr 2023 19:53:17 +0000</pubDate>
      <link>https://dev.to/ldnovaes/como-melhorar-a-legibilidade-do-codigo-5cc4</link>
      <guid>https://dev.to/ldnovaes/como-melhorar-a-legibilidade-do-codigo-5cc4</guid>
      <description>&lt;p&gt;Como desenvolvedores, escrevemos código para expressar nossas ideias e soluções de maneira lógica e clara. No entanto, muitas vezes nos deparamos com o problema de que o nosso código pode ser difícil de ler e entender, tanto para nós mesmos quanto para outros desenvolvedores. Felizmente, há algumas práticas simples que podemos adotar para melhorar a legibilidade do nosso código.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Escolha nomes descritivos para variáveis, funções e classes: Nomes claros e concisos para as coisas que estamos definindo em nosso código tornam muito mais fácil entender o que está acontecendo em cada linha.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mantenha uma estrutura consistente: Adotar um padrão consistente para a organização do código (como a indentação, espaçamento e nomenclatura) faz com que o código seja mais fácil de seguir e entender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quebre o código em blocos lógicos: Isso ajuda a dividir o código em partes menores e mais gerenciáveis. Por exemplo, se tivermos uma função grande, podemos dividi-la em várias funções menores para facilitar o entendimento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comente o código: Adicionar comentários explicando o que o código está fazendo (e por que está fazendo isso) pode ser extremamente útil para outras pessoas que podem estar lendo nosso código.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simplifique a lógica: Às vezes, podemos nos perder em estruturas complicadas ou condições if/else confusas. Em vez disso, podemos simplificar a lógica tanto quanto possível para tornar o código mais fácil de entender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use espaços em branco: Adicionar espaços em branco entre as linhas e blocos de código pode ajudar a tornar o código mais legível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evite repetição: Usar loops e funções para evitar repetição de código pode tornar o código mais conciso e fácil de entender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mantenha o código atualizado: À medida que o código evolui e muda, é importante manter tudo atualizado e limpo. Isso pode evitar problemas de legibilidade no futuro.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Melhorar a legibilidade do código não só torna a vida dos outros desenvolvedores mais fácil, mas também torna nosso próprio trabalho mais eficiente e menos propenso a erros. Ao seguir essas práticas simples, podemos escrever código que é fácil de ler, entender e manter.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como ter a sua primeira contribuição no GitHub garantida</title>
      <dc:creator>Leandro Duarte</dc:creator>
      <pubDate>Thu, 30 Mar 2023 13:41:22 +0000</pubDate>
      <link>https://dev.to/ldnovaes/como-ter-a-sua-primeira-contribuicao-no-github-garantida-35g8</link>
      <guid>https://dev.to/ldnovaes/como-ter-a-sua-primeira-contribuicao-no-github-garantida-35g8</guid>
      <description>&lt;p&gt;Como ter a sua primeira contribuição garantida&lt;/p&gt;

&lt;p&gt;Se você está começando no mundo da programação e ainda não teve a chance de contribuir para um projeto no GitHub, não se preocupe. É normal sentir-se um pouco intimidado com o processo, mas com as ferramentas certas e um pouco de conhecimento, você pode garantir a sua primeira contribuição.&lt;/p&gt;

&lt;p&gt;O primeiro passo é entender como funciona o processo de contribuição para um projeto no GitHub. A maioria dos projetos tem um arquivo README.md que explica o propósito e as regras de contribuição. Certifique-se de ler atentamente este arquivo antes de fazer qualquer alteração. Em seguida, procure as issues (problemas) no repositório. As issues são as tarefas que precisam ser resolvidas no projeto. Você pode procurar por issues com a tag "good first issue" (boa primeira tarefa) ou "help wanted" (ajuda necessária). Essas tags indicam que a tarefa é adequada para novos contribuidores.&lt;/p&gt;

&lt;p&gt;O próximo passo é aprender mais sobre o GIT e o GitHub. O GIT é uma ferramenta de controle de versão que permite que você trabalhe em um projeto sem interferir no trabalho de outras pessoas. O GitHub é uma plataforma que permite que os usuários hospedem e colaborem em projetos usando o GIT. Para começar, crie uma conta no GitHub e baixe o GIT para o seu computador.&lt;/p&gt;

&lt;p&gt;Agora que você está familiarizado com o processo de contribuição e com as ferramentas necessárias, é hora de encontrar um projeto para contribuir. O First Contribuitions é um projeto perfeito para quem está começando. Ele tem como objetivo ajudar novos contribuidores a se acostumarem com o processo de contribuição para projetos no GitHub. Você pode encontrar o repositório do First Contribuitions aqui: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/firstcontributions/first-contributions/blob/main/translations/README.pt_br.md"&gt;First Contribuitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O repositório First Contribuitions tem uma lista de tarefas simples que você pode realizar para ajudar no projeto. Para começar, escolha uma tarefa que você se sinta confortável em realizar. Em seguida, siga os passos descritos abaixo dos arquivos do repositório. Certifique-se de seguir as instruções cuidadosamente para garantir que sua contribuição seja aceita.&lt;/p&gt;

&lt;p&gt;Lembre-se de que a primeira contribuição pode parecer intimidante, mas é uma ótima maneira de aprender mais sobre programação e colaboração em projetos. Com as ferramentas certas e um pouco de conhecimento, você pode garantir a sua primeira contribuição e começar a fazer a diferença no mundo da programação. Boa sorte!&lt;/p&gt;

&lt;p&gt;Lembrando que qualquer dúvida eu estou aqui a disposição. &lt;/p&gt;

&lt;p&gt;OBS: Não esqueçam de seguir o passo a passo do repositório. E desde já, quero parabenizar aos corajosos que foram fazer sua primeira contribuição. É apenas o começo de uma longa e incrível carreira. Desejo sucesso a todos vocês, iniciantes ou não. Aos tímidos eu desejo coragem e resiliência. Não se deixem serem intimidados por uma tecnologia, vão e enfrentem como verdadeiros heróis! &lt;/p&gt;

&lt;p&gt;CREDITOS: Imagem retirada de: &lt;a href="https://blog.da2k.com.br/2015/01/31/segredos-do-github-incentivar-a-contribuicao-para-seus-projetos-open-source/"&gt;Da2K&lt;/a&gt;&lt;/p&gt;

</description>
      <category>you</category>
      <category>first</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
