<?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: the-sidh</title>
    <description>The latest articles on DEV Community by the-sidh (@thesidh).</description>
    <link>https://dev.to/thesidh</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%2F365527%2F04614044-1573-49fb-9137-ad67defeb157.jpeg</url>
      <title>DEV Community: the-sidh</title>
      <link>https://dev.to/thesidh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thesidh"/>
    <language>en</language>
    <item>
      <title>Escrevendo testes unitários para seus repositórios MongoDB usando o FlapDoodle Embedded Mongo</title>
      <dc:creator>the-sidh</dc:creator>
      <pubDate>Sat, 01 Aug 2020 18:46:54 +0000</pubDate>
      <link>https://dev.to/thesidh/escrevendo-testes-unitarios-para-seus-repositorios-mongodb-usando-o-flapdoodle-embedded-mongo-2fha</link>
      <guid>https://dev.to/thesidh/escrevendo-testes-unitarios-para-seus-repositorios-mongodb-usando-o-flapdoodle-embedded-mongo-2fha</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z83oU-4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nio2c23dwy786bdjk99m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z83oU-4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nio2c23dwy786bdjk99m.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um aspecto do desenvolvimento de software que vem me interessando cada vez mais é qualidade. Posso afirmar com certeza que após começar a praticar ativamente TDD (Test driven development) a qualidade do meu código e das minhas entregas aumentou de forma exponencial. Mais que isso, praticar TDD plantou a semente da preocupação contínua com qualidade.&lt;/p&gt;

&lt;p&gt;Pretendo abordar em uma séria de artigos algumas das práticas que me ajudam a conseguir aplicar o TDD de forma efetiva e que moldaram minha abordagem sobre qualidade no desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;Para começar, escolhi um assunto que tem um certo potencial de polêmica: Testes unitários de repositórios usando uma instancia embedded do banco.&lt;/p&gt;

&lt;p&gt;Polêmico por 2 motivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pode ser questionável a necessidade de testar a camada repositório (e, em nível mais essencial, até mesmo a necessidade de efetivamente escrever o código nessa camada)&lt;/li&gt;
&lt;li&gt;Partindo do pressuposto que você vê valor no item anterior, uma abordagem alternativa - e muito difundida - é subir uma instância do banco no docker, criar um database com sufixo "-test" e executar seus testes nesse Database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pessoalmente, sou super fã de docker e de "conteinerização", mas vejo duas vantagens matadoras em usar a abordagem "embedded":&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Independência dos container - não sabemos com certeza as características do ambiente que os desenvolvedores contarão. Questões como diferentes privilégios de acesso e até mesmo impossibilidade total de levantar containers devem ser levadas em conta&lt;/li&gt;
&lt;li&gt;É  mais rápido e mais fácil levantar uma instância embedded do que dropar database a cada execução de testes. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Um ponto de resistência de muitos desenvolvedores em aplicar o TDD é a divisão de foco entre o teste e o código de produção. Quanto mais tempo entre as interações, mais essa sensação de perda de foco é maximizada. Acredito que a decisão de qual estratégia adotar para os testes deve ter como preocupação fundamental fornecer a melhor experiência possível para o desenvolvedor.&lt;/p&gt;

&lt;p&gt;Para o restante desse artigo, mostrarei uma abordagem para testar repositórios MongoDB utilizando o projeto Flapdoodle. &lt;br&gt;
Usarei Kotlin como linguagem nos exemplos e no projeto que disponibilizo de modelo &lt;a href="https://github.com/the-sidh/zmovies"&gt;https://github.com/the-sidh/zmovies&lt;/a&gt;&lt;br&gt;
O MongoDB é o banco que eu mais tenho usado, tanto em projetos pessoais quanto profissionalmente. Ele é amplamente usado no mercado, e por isso acredito ser relevante para essa abordagem.&lt;/p&gt;
&lt;h2&gt;
  
  
  Flapdoodle Embedded MongoDB
&lt;/h2&gt;

&lt;p&gt;O (&lt;a href="https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo"&gt;Flapdoodle&lt;/a&gt;) é um projeto open source que tem como objetivo prover uma plataforma para neutra para rodar testes unitários no MongoDB.&lt;br&gt;
Basicamente, precisamos subir um um processo do MongoDB.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun start(val host: String, val port: Int) {
    val starter = MongodStarter.getDefaultInstance()
    val mongodConfig = MongodConfigBuilder()
        .version(Version.Main.V4_0)
        .net(Net(host, port, Network.localhostIsIPv6()))
        .build()
    val mongodExecutable: MongodExecutable = starter.prepare(mongodConfig)
    val mongodProcess: MongodProcess = mongodExecutable.start()
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Feito isso, temos nosso processo do MongoDB rodando.&lt;br&gt;
No projeto de exemplo, isolei esses objetos em uma classe holder, para poder fazer referencia a ela por dentro de uma classe extension do JUnit5&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;override fun beforeAll(context: ExtensionContext?) {
        flapDoodleHolder.start()
    }

    override fun afterAll(context: ExtensionContext?) {
        flapDoodleHolder.stop()
    }

    override fun beforeEach(context: ExtensionContext?) {
        flapDoodleHolder.clean()
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O código de referência pode ser encontrado aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/the-sidh/zmovies/blob/master/src/test/kotlin/com/thesidh/zmovie/storage/holder/FlapDoodleHolder.kt"&gt;FlapDoodleHolder.kt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/the-sidh/zmovies/blob/master/src/test/kotlin/com/thesidh/zmovie/storage/extension/MongoDBExtension.kt"&gt;MongoDBExtension.kt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma vez feito isso, consigo utilizar toda essa instância embedded para executar meus testes. Na classe de teste, basta fazer referência à extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@ExtendWith(MongoDBExtension::class)
class MongoDBMoviesRepositoryTest(private val mongoDatabase: MongoDatabase) {
(...)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E a partir daí, é só felicidade! &lt;/p&gt;

&lt;p&gt;Happy TDD!&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>tdd</category>
      <category>mongodb</category>
    </item>
  </channel>
</rss>
