Skip to content

União do projeto desenvolvido no curso 'Modelagem de Domínios Ricos' com os testes criados no curso 'Dominando Testes de Softwares'. Com melhorias e correções de bugs.

Notifications You must be signed in to change notification settings

jeanbarcellos/estudo.csharp.nerd-store

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Repositório apenas para estudo

NerdStore

Projeto desenvolvido no curso 'Modelagem de Domínios Ricos' juntamente com os testes feitos no curo 'Dominando Testes de Softwares'

Instrutor:

Referências:

Modelatem Estratégica

Requisitos

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

Definindo contextos e elementos chave

Contextos e elementos chave

Enquadramento dos elementos dentro das categorias

Contextos e elementos chave

Tipos de Domínio:

  • Domínio Principal
  • Domínio de Suporte
  • Domínio Genérico

Mapa de contexto

Mapa de contexto

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

DDD

Mapa de contexto

Camada de apresentação (Presentation Layer)

  • 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

Camada de aplicação (Application Layer)

  • 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

Camada de Domínio (Domain Layer)

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

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...

Camada de Infraestrutura (Infrastructure Layer)

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

Modelatem Tática

Estrutura

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

Contexto Catálogo

...

Contexto Vendas

Requisitos:

PEDIDO - ITEM PEDIDO - VOUCHER

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.

  1. Adicionar Item

    1. Ao adicionar um item é necessário calcular o valor total do pedido
    2. Se um item já está na lista então deve acrescer a quantidade do item no pedido
    3. O item deve ter entre 1 e 15 unidades do produto
  2. Atualizacao de Item

    1. O item precisa estar na lista para ser atualizado
    2. Um item pode ser atualizado contendo mais ou menos unidades do que anteriormente
    3. Ao atualizar um item é necessário calcular o valor total do pedido
    4. Um item deve permanecer entre 1 e 15 unidades do produto
  3. Remoção de Item

    1. O item precisa estar na lista para ser removido
    2. 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

  1. Aplicar voucher de desconto
    1. O voucher só pode ser aplicado se estiver válido, para isto:
      1. Deve possuir um código
      2. A data de validade é superior a data atual
      3. O voucher está ativo
      4. O voucher possui quantidade disponivel
      5. Uma das formas de desconto devem estar preenchidas com valor acima de 0
    2. Calcular o desconto conforme tipo do voucher
      1. Voucher com desconto percentual
      2. Voucher com desconto em valores (reais)
    3. Quando o valor do desconto ultrapassa o total do pedido o pedido recebe o valor: 0
    4. Após a aplicação do voucher o desconto deve ser re-calculado após toda modificação da lista de itens do pedido

PEDIDO COMMANDS - HANDLER

  • 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
  1. AdicionarItemPedidoCommand:

    1. Verificar se é um pedido novo ou em andamento
    2. Verificar se o item já foi adicionado a lista

Testes

Tipos de testes comuns:

  • Tesste de Unidade
  • Testes de Integração
  • Testes Automatizados
  • Testes de Carga

Testes de Unidade

  • 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
    

Padrões e Nomenclaturas

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

Testes de Integração

...

BDD

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

  1. No Visual Studio
  2. Barra de menu > Extensions > Manage Extensions
  3. Ir em Online
  4. Pequisar por SpecFlow e instalar

...

**Testes Automatizados **

  • 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
  • Colocar o arquivo chromedriver em C:\WebDriver
  • Instalar os pacotes
    Install-Package Selenium.WebDriver
    Install-Package Selenium.Support
    




TO-DO / Trabalhos Futuros

1. Testes faltantes

  • Criar testes para os pacotes
    • Core
    • Pagamentos.Business

2. EventSourcing

  • 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 usar Event Sourcing, fazer esta implementação também aqui.
    • Adicionar configuração para tonar opcional o uso

3. Conteinerizar

  • Criar containers docker para os bancos de dados e projetos

About

União do projeto desenvolvido no curso 'Modelagem de Domínios Ricos' com os testes criados no curso 'Dominando Testes de Softwares'. Com melhorias e correções de bugs.

Topics

Resources

Stars

Watchers

Forks

Languages