Skip to content

Instantly share code, notes, and snippets.

@herberthamaral

herberthamaral/README.md

Last active Mar 24, 2020
Embed
What would you like to do?
Caso de uso e implementação básica

Pequeno exemplo de estória de usuário (user story) com implementação

Algumas observações a respeito dos arquivos deste gist:

  1. O arquivo Python pode ser executado diretamente para que os testes dentro dele sejam executados;
  2. Por questões de simplicidade, optou-se por deixar o código de produção junto com o código de testes, mas isso não é recomendado em um projeto real -- os dois tipos de código devem ficar separados;
  3. Também por questões de simplicidade, um framework de BDD (como o python-behave) não foi utilizado;
  4. Apenas os dois primeiros cenários foram implementados;
  5. A forma normal de utilizar o unittest é criar uma pasta tests e colocar todos os arquivos lá e utilizar o comando python -m unittest como consta na documentação [1].

[1] - https://docs.python.org/3.8/library/unittest.html#command-line-interface

Funcionalidade: Colocar produto no carrinho de compras
Cenário: Usuário logado adiciona produto no carrinho de compras
Dado que eu sou um usuário do ecommerce
Quando eu escolho um produto
E o seleciono para compras
Então o meu carrinho de compras deverá ter aquele produto
Cenário: Usuário anônimo tenta adicionar um produto no carrinho de compras
Dado que eu sou um usuário não autenticado
Quando eu tento adicionar um produto no carrinho de compras
Então eu devo ser redirecionado à página de login
E eu devo ver a mensagem: "Por favor, faça o login antes de continuar"
Cenário: Usuário tenta adicionar um produto que não há em estoque
Dado que eu sou um usuário autenticado
Quando eu tento adicionar um produto que não está no estoque
Então eu devo ver uma mensagem de erro "Este produto não está em estoque"
E o produto não deverá ser adicionado no carrinho de compras
# python 3.8
import unittest
from dataclasses import dataclass
from typing import Dict
class LoginNecessario(Exception):
pass
@dataclass
class Produto:
id: int
nome: str
class CarrinhoCompras:
produtos: Dict[int, int] = {}
def adiciona_produto(self, produto: Produto, quantidade: int) -> None:
self.produtos[produto.id] = quantidade
def total_produtos(self) -> int:
return len(self.produtos)
@dataclass
class Usuario:
id: int
carrinho: CarrinhoCompras
def adicionar_produto_carrinho(self, produto: Produto, quantidade: int) -> None:
if not self.logado():
raise LoginNecessario("Por favor, faça seu login antes de continuar")
self.carrinho.adiciona_produto(produto, quantidade)
def logado(self) -> bool:
return self.id != 0
class ColocarProdutoNoCarrinhoDeComprasTestCase(unittest.TestCase):
def test_usuario_logado_adiciona_produto_no_carrinho_de_compras(self):
carrinho = CarrinhoCompras()
usuario = Usuario(id=1, carrinho=carrinho)
produto = Produto(id=9, nome='produto')
usuario.adicionar_produto_carrinho(produto, quantidade=1)
self.assertEqual(1, carrinho.total_produtos())
self.assertIn(produto.id, carrinho.produtos)
def test_usuario_anonimo_tenta_adicionar_um_produto_no_carrinho_de_compras(self):
carrinho = CarrinhoCompras()
usuario = Usuario(id=0, carrinho=carrinho)
produto = Produto(id=9, nome='produto')
with self.assertRaises(LoginNecessario):
usuario.adicionar_produto_carrinho(produto, quantidade=1)
self.assertEqual(0, carrinho.total_produtos())
self.assertNotIn(produto.id, carrinho.produtos)
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.