Repositório apenas para estudo
Projeto desenvolvido no curso 'Modelagem de Domínios Ricos' juntamente com os testes feitos no curo 'Dominando Testes de Softwares'
Instrutor:
Referências:
- https://desenvolvedor.io/curso-online-modelagem-de-dominios-ricos/
- https://desenvolvedor.io/curso-online-dominando-os-testes-de-software
Requisitos (Conversa com o):
- A loja virtual exibirá um catálogo de produtos de diversas categorias
- Um cliente pode realizar um pedido contendo de 1 a N produtos.
- A loja realizará as vendas através de pagamento por cartão de crédito.
- O cliente irá realizar o seu cadastro para poder fazer pedidos.
- O cliente irá confirmar o pedido, endereço de entrega, escolher o tipo de frete e realizar o pagamento.
- Após o pagamento o pedido mudará de status conforme reposta da transação via cartão
- O correta a emissão da nota fiscal logo após a confirmação do pagamento do pedido
Identificação dos elementos:
- A loja virtual exibirá um catálogo de produtos de diversas categorias
- Um cliente pode realizar um pedido contendo de 1 a N produtos.
- A loja realizará as vendas através de pagamento por cartão de crédito.
- O cliente irá realizar o seu cadastro para poder fazer pedidos.
- O cliente irá confirmar o pedido, endereço de entrega, escolher o tipo de frete e realizar o pagamento.
- Após o pagamento o pedido mudará de status conforme reposta da transação via cartão
- O correta a emissão da nota fiscal logo após a confirmação do pagamento do pedido
Identificação das possíveis ações:
- A loja virtual exibirá um catálogo de produtos de diversas categorias
- Um cliente pode realizar um pedido contendo de 1 a N produtos.
- A loja realizará as vendas através de pagamento por cartão de crédito.
- O cliente irá realizar o seu cadastro para poder fazer pedidos.
- O cliente irá confirmar o pedido, endereço de entrega, escolher o tipo de frete e realizar o pagamento.
- Após o pagamento o pedido mudará de status conforme reposta da transação via cartão
- O correta a emissão da nota fiscal logo após a confirmação do pagamento do pedido
Tipos de Domínio:
- Domínio Principal
- Domínio de Suporte
- Domínio Genérico
Tipo de relacionamento entre contextos:
- Cliente-Fornecedor (Customer-Supplier Development)
- Onde um contexto influencia no ouro
- Parceiro (Partner)
- Colaboram, não existe uma direção. Os dois são iguais
- Se um muda, o outro muda também.
- Conformista (Conformist)
- É quando duas equipes possuem uma dependência mútua
- Precisam, portanto, trabalhar juntos
- Camada de anticorrupção (Anticorruption Layer)
- Nesse relacionamento a equipe downstream decide criar uma camada para proteger seu contexto das modificações upstream. É um típico cenário de sistemas legados
- Garantir que tenha um único ponto de quebra
- Fachada
- Núcleo Compartilhado (Shared Kernel)
- Quando vários bounded context compartilham um mesmo domínio. Alterar significa que todas as equipes serão afetadas.
- Classes base e Interfaces
- PERIGO: Tudo que tiver no núcleo compartilhada, terá um forte acoplamento em todas os contextos
- Faz o front com o usuário
- Pode ser MVC, WebApi, REST, Mobile, SPA
- Camada de Apresentação está duplamente ligada com a camada de aplicação
- Não precisa, necessariamente, ser um projeto na arquitetura.
- Pode ser um controller, simplesmente
Responsabilidade
- Em qual camada deve ficar o código que formata os dados para a apresentação?
- Se os dados vão ser exibidos em apresentação é lá que deve ser tratado”
- Isso parece ser responsabilidade de negócio, deveria ser uma camada de negócios.
- Dados são dados, é a base de dados que retorna as informações tratadas
- Envia informação para apresentação
- Fornece dados prontos para consumo conforme necessidade de exibição
- Orquestra cações disparadas pelos elementos de apresentação (Espécie de Workflow)
- Casos de uso da camada de apresentação
- Duplamente ligada com a camada de apresentação
- Pode ser estendida ou duplicada quando um novo frontend é adicionado
Domain Model Pattern:
- Modelos do domínio
- Entidade baseada em OOP
- Modelos Funcionais
- Guia para classes entidades
- Convenções do DDD
- Factories
- Value types
- Private setters
- Dados e comportamento
- Convenções do DDD
Serviços de Domínio
- Partes do domínio que não se encaixam em entidades existentes
- Classes que agrupam comportamentos diversos
- Tipicamente trabalhando com diversas entidades
- Implementação de processos que:
- Requerem acesso à persistência para ler e gravar
- Requerem acesso a serviços externos
Caso seja implementado CRQS, esta camada terá também Comandos, ComandoHandlers, Events...
Em resumo, é uma super camada que agrega o ferramental
Dica: Isole os detalhes da camada de infra
Fazer uso de facades para isolar detalhes tecnológicos
Diretórios lógicos da Solution
- Services - Ficará toda modelagem dos contextos
- Cadastros – Contexto Auxiliar
- Catalogo – Contexto Principal
- Core – Núcleo Compartilhado (Shared Kernel)
- Fiscal – Contexto Auxiliar
- Pagamentos – Contexto Genérico
- Vendas – Contexto Principal
- WebApps - Ficará as aplicações web
...
Requisitos:
Um item de um pedido representa um produto e pode conter mais de uma unidade Independente da ação, um item precisa ser sempre valido:
- Possuir: Id e Nome do produto, quantidade entre 1 e 15 unidades, valor maior que 0
Um pedido enquanto não iniciado (processo de pagamento) está no estado de rascunho e deve pertencer a um cliente.
-
Adicionar Item
- Ao adicionar um item é necessário calcular o valor total do pedido
- Se um item já está na lista então deve acrescer a quantidade do item no pedido
- O item deve ter entre 1 e 15 unidades do produto
-
Atualizacao de Item
- O item precisa estar na lista para ser atualizado
- Um item pode ser atualizado contendo mais ou menos unidades do que anteriormente
- Ao atualizar um item é necessário calcular o valor total do pedido
- Um item deve permanecer entre 1 e 15 unidades do produto
-
Remoção de Item
- O item precisa estar na lista para ser removido
- Ao remover um item é necessário calcular o valor total do pedido
Um voucher possui um código único e o desconto pode ser em percentual ou valor fixo Usar uma flag indicando que um pedido teve um voucher de desconto aplicado e o valor do desconto gerado
- Aplicar voucher de desconto
- O voucher só pode ser aplicado se estiver válido, para isto:
- Deve possuir um código
- A data de validade é superior a data atual
- O voucher está ativo
- O voucher possui quantidade disponivel
- Uma das formas de desconto devem estar preenchidas com valor acima de 0
- Calcular o desconto conforme tipo do voucher
- Voucher com desconto percentual
- Voucher com desconto em valores (reais)
- Quando o valor do desconto ultrapassa o total do pedido o pedido recebe o valor: 0
- Após a aplicação do voucher o desconto deve ser re-calculado após toda modificação da lista de itens do pedido
- O voucher só pode ser aplicado se estiver válido, para isto:
-
O command handler de pedido irá manipular um command para cada intenção em relação ao pedido. Em todos os commandos manipulados devem ser verificados:
- Se o command é válido
- Se o pedido existe
- Se o item do pedido existe
-
Na alteração de estado do pedido:
- Deve ser feita via repositório
- Deve enviar um evento
-
AdicionarItemPedidoCommand:
- Verificar se é um pedido novo ou em andamento
- Verificar se o item já foi adicionado a lista
Tipos de testes comuns:
- Tesste de Unidade
- Testes de Integração
- Testes Automatizados
- Testes de Carga
-
XUnit.net
- Escrito pelos criados do NUnit
- Compatível com o Visual Studio
- Utilizado pelo time de desenvolvimento do .NET Core e ASP.NET
-
Instalação do framework
Install-Package xunit
-
Instalação para reconhecimento do Visual Studio
Install-Package xunit.runner.visualstudio
AAA - Arrange, Act, Assert
- Arrange – Arranjar (preparar os dados que serão testados)
- Act – Atuação - A execução do teste
- Assert – Asserção – Validar se o resultado confere com a intenção dos testes
Nomenclatura de Testes de unidade
ObjetoEmTeste_MetodoComportamentoEmTeste_ComportamentoEsperado
- Pedido_AdicionarPedidoItem_DeveIncrementarUnidadesSeItemJaExistente
- Estoque_RetirarItem_DeveEnviarEmailSeAbaixoDe10Unidades
MetodoEmTeste_EstadoEmTeste_ComportamentoEsperado
- AdicionarPedidoItem_ItemExisteCarrinho_DeveIncrementarUnidadesDoItem
- RetirarItemEstoque_EstoqueAbaixoDe10Unidades_DeveEnviarEmailDeAviso
...
SpecFlow
- Versão do Cocumber para .ET
- Utilizar o Gherkin Parser para transformar o texto em ações
- Compatível com todas as versões do VC atuais
Link: https://specflow.org/
Instalação do framework
Install-Package SpecFlow
Instalação para reconhecimento do Visual Studio com XUnit
Install-Package SpecFlow.xUnit
Passo a passo
- No Visual Studio
- Barra de menu > Extensions > Manage Extensions
- Ir em Online
- Pequisar por SpecFlow e instalar
...
-
Apresentação
- Utilização do Selenium
- Page Object Model
- Testes de Aceitação / regreção com SpecFlow
- Boas Práticas no design dos testes
-
Selenium
- Realiza a automação de ações para browsers
- Utilizado para automação de testes e Web Crawling
- Compatível com Visual Studio
Driver do Google Chrome para utilização do Selenium
- Baixar o driver
- Link: https://chromedriver.chromium.org/downloads
- ATENÇÃO: Baixar a mesma versão do navegador atual
- Link: https://chromedriver.chromium.org/downloads
- Colocar o arquivo
chromedriver
emC:\WebDriver
- Instalar os pacotes
Install-Package Selenium.WebDriver Install-Package Selenium.Support
- Criar testes para os pacotes
- Core
- Pagamentos.Business
- Adicionar o pacote
EventSourcing
ao projeto e fazer sua implementação.- Como no curso
Modelagem de domínios Ricos
tem uma demonstração de como usarEvent Sourcing
, fazer esta implementação também aqui. - Adicionar configuração para tonar opcional o uso
- Como no curso
- Criar containers docker para os bancos de dados e projetos