Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 20, 2021 01:33 am GMT

Testes Arquiteturais - Padronize j a arquitetura do seu projeto!

Introduo

image

Muita das vezes quando iniciamos um projeto, a maior dificuldade que possumos no momento de fazer a organizao entre os nossos pacotes, classes e definies de qual classe poder ter acesso a determinada outra classe, aps derrotarmos essa dificuldade, o nosso prximo desafio mantermos essa organizao e documentarmos para os futuros desenvolvedores ou at mesmo ns, como definimos a arquitetura do nosso projeto, isso o que voc ir ver a seguir!

Por qu Testes Arquiteturais?

image

Como foi dito anteriormente, alm de organizarmos mais o nosso projeto e definirmos uma conveno, conseguimos ter uma documentao de uma forma bem amigvel,conforme exemplo visto abaixo, vimos uma regra informando onde as classes anotadas com Entity devero residir:

@ArchTest    static final ArchRule entities_must_reside_in_a_domain_package =            classes().that().areAnnotatedWith(Entity.class).should().resideInAPackage("..domain..")                    .as("Entidades devero residir no pacote de domnios");

Mas que tal agora colocarmos a mo na massa? :)

Quais tecnologias iremos utilizar?

image

Para esse artigo em questo, iremos precisar ter as seguintes tecnologias no nosso projeto:

  1. Java 8+: Linguagem de Programao Java na verso 8+
  2. Maven: Ferramenta de automao para compilao
  3. ArchUnit: Ferramenta que ser utilizada para o desenvolvimento dos nossos testes arquiteturais
  4. Spring: Framework de programao

No irei entrar muito a dentro de todas as tecnologias utilizadas pois no o nosso objetivo desse artigo.

Configurando o nosso projeto:

image

Para que possamos utilizar o archunit no nosso projeto, ser necessrio adicionarmos a seguinte dependncia:

<dependency>    <groupId>com.tngtech.archunit</groupId>    <artifactId>archunit-junit5</artifactId>    <version>0.18.0</version>    <scope>test</scope></dependency>

Aps isso, iremos fazer uma criao de uma nica classe chamada ArchitectureTest no nosso pacote de testes, no qual ir ter a seguinte implementao nesse primeiro momento:

@AnalyzeClasses(        packages = "SeuPacote",        importOptions = ImportOption.DoNotIncludeTests.class)public class ArchitectureTest {}

Observao: No exemplo acima, foi inserido uma opo para que no inclusse os testes na nossa validao, mas caso voc queira definir um padro no nome dos seus testes tambm, pode ficar vontade. :)

Agora sim, vamos ao que nos interessa! =D

image

Juntos, iremos definir uma arquitetura simples na qual iremos ter classes de Controller que iro poder chamar apenas as classes Service e que podero chamar somente classes Repository, conforme visto no desenho abaixo:

image

Aps isso, iremos definir como ir ficar o nome de cada classe e por ltimo, qual ser o pacote que a mesma ir residir, dito isso, vamos criar a nossa arquitetura? :)

Definindo o nome das nossas classes:

image

No 1 passo iremos definir como dever ser o nome das nossas classes, j que somos pessoas extremamente criativas, vamos utilizar o nome de cada anotao no final da nossa classe, porqu ser que ningum nunca pensou nisso antes? :D

    @ArchTest    static ArchRule ClassesQuePossuemAnotacaoController_DeveraoFinalizarComNomeController =            classes()                    .that().areAnnotatedWith(Controller.class)                    .should().haveSimpleNameEndingWith("Controller")            .as("Caro desenvolvedor, todas as nossas classes que esto anotadas como Controller, devero ter o nome finalizado com Controller");

Como visto acima, o uso dos testes do ArchUnit so bem simples e bastante intuitivos, dentro do nosso teste estamos informando que toda classe que est anotada como Controller, dever ter o nome finalizado como Controller e alm disso deixamos uma dica para o prximo desenvolvedor que no fizer da forma que ns planejamos, utilizando o ".as(....)", isso no legal? :)

Forcei um erro, mudando o nome da nossa classe para UsuarioJoao, olha que legal o que aconteceu:

image

Aps isso, basta criarmos as regras para as nossas outras classes, mas isso agora eu deixo para voc tentar :)

Caso no consiga no se preocupe, basta abrir o GitHub do projeto :)

Definindo a residncia das nossas classes:

image

No 2 passo iremos definir onde cada classe ir residir, o teste ir ser bastante similar ao anterior, ento vamos l? :)

@ArchTest    static ArchRule ClassesQuePossuemAnotacaoController_DeveraoResidirNoPacoteController =            classes()                    .that().areAnnotatedWith(Controller.class)                    .should().resideInAPackage("..controller..")                    .as("Caro desenvolvedor, todas as nossas classes que esto anotadas como Controller, devero residir no pacote *.controller");

Com o exemplo acima, informamos no ".resideInAPackage(...)", qual ser o local que a nossa classe de fato ir residir.

Definindo qual classe ir chamar qual classe:

image

Por ltimo, para concluirmos o nosso desafio, precisamos definir qual classe ir chamar a outra, para que dessa forma, tenhamos o controle de qual classe poder conhecer a outra, para isso iremos seguir o exemplo abaixo:

 @ArchTest    static final ArchRule ClassesQueResidemNoPacoteControllerNaoPodemConhecerRepository =            noClasses().that().resideInAPackage("..controller..")                    .should().dependOnClassesThat().resideInAPackage("..repository..")            .as("As classes Repository no podem ficar juntas das classes Controller :(");

No exemplo acima, definimos que nenhuma classe que resida no pacote Controller poder depender de nenhuma classe que resida no pacote Repository, que histria triste de amor, no? :D

Obrigado pessoal =D

image

Agradeo a todos vocs que leram o meu artigo e que me acompanham na criao dos meus contedos :)

O ArchUnit, possui uma tima documentao e me ajuda muito nos projetos que executo no meu dia dia, o que voc acha de apresentar isso nos seus projetos? :)


Original Link: https://dev.to/gabrielaugusto1996/testes-arquiteturais-padronize-ja-a-arquitetura-do-seu-projeto-10fe

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To