Escolar Documentos
Profissional Documentos
Cultura Documentos
------------------------------
Introdução
------------------------------
Como saber se seu código está funcionando?
talvez vc precise de uma pessoa dar esse feedback
E talvez esse tempo que vc dependa dela é um tempo relativamente grande
O que eu posso fazer para reduzir esse tempo?O que faço para ser mais
idenpendente dessa pessoa?
Mas será que eu fico mais confiante ao mandar o código
para essa equipe de teste?Para essa pessoa?
No curso vamos aprender técnicas para aumento de confiança
do nosso código.
------------------------------
O sistema de leilões
------------------------------
Se não tiver esse template de projeto instalado abra o menu Ferramentas\Extensões
e Atualizações e procure pela extensão Microsoft Visual Studio Test Platform.
Em seguida basta instalá-la ou habilitá-la.
------------------------------
Avaliando um leilão
------------------------------
Estamos prontos para implementar a primeira história juntos
Trello
Fazer ---Fazendo---Feito
Backlog--Desenvolvendo--Pronto
+++++++++++++++++++++++++++++++++++++
Problemas ao referenciar uma classlibrary do .net framework core - C#
link: Muito Importante
https://pt.stackoverflow.com/questions/268091/problemas-ao-referenciar-uma-
classlibrary-do-net-framework-core-c
--------------------------------------------------------------------
Não faz. Os dois frameworks são coisas diferentes e incompatíveis. |
|
Pra isto existe o .NET Standard, você pode fazer com que a class |
library tenha como target o .NET Standard e isso vai fazer com |
que ela possa ser usada tanto em projetos |
.NET Core como em projetos .NET Framework. |
-------------------------------------------------------------------
leilao.RecebeLance(fulano, 800);
leilao.RecebeLance(maria, 900);
leilao.RecebeLance(fulano, 1000);
Console.WriteLine(leilao.Ganhador.Valor);
leilao.TerminaPregao();
Console.WriteLine(leilao.Ganhador.Valor);
leilao.RecebeLance(fulano, 800);
leilao.RecebeLance(maria, 900);
leilao.RecebeLance(fulano, 1000);
leilao.RecebeLance(maria, 990);
//vamos ter 990 escrito no terminal do console , e está errado
Então sabemos que nosso código não está legal
//Entao aquele código que pega o ultimo lance
//nao está funcionando
E isso é bom, tivemos um retorno rápido do nosso erro
problema e as pessoas nao utilizaram em produçao
graças a Deus
+++++++++
Para dar um pause no final da execuçao do console
podemos usar Console.Read() ou executar com
CONTROL+F5
------------------------------
Objetivos da aula
------------------------------
------------------------------
Estrutura de teste automatizado
------------------------------
Esse é um link que mostra um pouco dessa incompletude
esse link é uma proposta de padrão para vc organizar,arrajar,
formatar o código que são métodos em testes unitários
e
http://wiki.c2.com/?ArrangeActAssert
é o Triplo AAA
++++++++++++++++++++++++++++++++++++++++++
Asset com [Console].WriteLine não é automatizado
Por isso o teste não está completo
Console.WriteLine(leilao.Ganhador.Valor);
if (valorEsperado == valorObtido)
{
Console.WriteLine("Teste ok");
}
else
{
Console.WriteLine("Teste FALHOU");
}
++++++++++++++++++++++++++++++
//Aqui nenhum de nos precisa saber a resposta
pode ser qualquer pessoa a executar o teste
leilao.RecebeLance(fulano, 800);
leilao.RecebeLance(maria, 900);
leilao.RecebeLance(fulano, 1000);
leilao.RecebeLance(maria, 990);
//Assert
Console.WriteLine(leilao.Ganhador.Valor);
//---------------------------------ou
//--aqui estaria automatizado
var valorEsperado = 1000;
var valorObtido = leilao.Ganhador.Valor;
if (valorEsperado == valorObtido)
{
Console.WriteLine("Teste ok");
}
else
{
Console.WriteLine("Teste FALHOU");
}
//Console.Read();
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
UNIT TEST-é a parte mais interna de que você
pode testar. Em geral isso é representado por um método
em uma classe.Mas nem todos os metodos de uma classe terão
de ser testados unitariamente. VOce pode testar um método
que chama outros métodos internamente.
class Program
{
private static void Verifica(double esperado,double obtido)
{
var cor = Console.ForegroundColor;
if (esperado == obtido)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Teste ok");
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(
$"Teste FALHOU! Esperado: {esperado} , obtido: {obtido}");
}
Console.ForegroundColor = cor;
+++++++++++++=
mas esse trabalho já foi feito para gente nao precisamos ficar preocupando com isso
e vamos aprender a usar no próximo video
COMeçamos a afastar do negócio e isso nao é legal
------------------------------
A biblioteca XUnit
------------------------------
++++++++++++++++++++++++
++++++++++++++++++++++++
O XUNIT NÃO TRABALHA COM MÉTODOS ESTATICOS
TROCA
private static void Verifica(double esperado,double obtido)
POR
Assert.Equal(valorObtido, valorEsperado);
using Xunit;
[Fact]
public void LeilaoComApenasUmLance()
}
++++++++
Tem outra forma de visualizar e é bem melhor
-Teste->Janelas->Gerenciador de testes
TEMOS RESULTADO DE FORMA VISUAL
VERDE VERMELHO
------------------------------
ENCONTRE O ERRO
------------------------------
------------------------------
REFERÊNCIAS UTILIZADAS
------------------------------
------------------------------
o que aprendemos?
------------------------------
---------------------------------------------------------
02.Organizando seus testes
---------------------------------------------------------
------------------------------
Escrevendo mais testes
------------------------------
++++++++++++++++++++++++
VOCÊ PODE TER MAIS DE UM ASSERT NA VERIFICAÇÃO
No caso está relacionado ao ganhador e faz sentido verificar mais
de uma propriedade tanto o valor quanto o cliente que foi
o ganhador
E o método Equal tem sobrecarga para tipos diferentes
e tem para o Equal para qualquer tipo, que no caso foi usada
<T>
Assert.Equal(valorObtido, valorEsperado);
Assert.Equal(beltrano, leilao.Ganhador.Cliente); //o segundo <T>
------------------------------
Escrevendo mais testes
------------------------------
Será que estou criando os testes certos? Afinal, que cenários devo testar?
Como organizo meus testes? Que nome devo dar às classes e métodos de testes?
------------------------------
O que devo testar
------------------------------
Aí ele disse que foi bastante ineficiente porque ele criou quatro testes
que estão testando a mesma partiçao de entrada
afinal nao importa se tem 10 clientes, 10 lances,2lances 1lance
POIS A EXPECTATIVA É SEMPRE A MESMA
O VALOR EXPERADO É O MAIOR VALOR DADO. eNTÃO A GENTE PODE
REPRESENTAR TADO AQUI EM APENSA UM CENÁRIO
++++++++++++++++++++++
+++++++++++++++++++++
eNTAO SUA MISSAO COMO TESTADOR É ACHAR A PARTIÁO, CLASSES DE
EQUIVALENCIA, E NÃO EXISTE UMA FORMULA PARA ISSO.
VOCE VAI TER A SUA EXPERIENCIA E SUA MENTORIA QUE VAI TI AJUDAR
-TEM OUTRA ANALISE TBM DE FAZER ANALISE DE FATORES
DE FRONTEIRA
PENSAR NAS FRONTEIRAS DOS TIPOS DE DADOS
EX:NESSE CASO TEMOS O DOUBLE
(VALOR NEGATIVO)
(CLIENTE QUE NAO TENHA SIDO CRIADO-VALOR NULL)
COMO VAI SE COMPORTAR
++++++++++++
CENARIO-> LEILAO SEM NENHUM LANCE
O QUE PRECISA ACONTECER QUANDO LEILAO TERMINAR SEM LANCE NENHUM?
------------------------------
Leilão sem lances
------------------------------
Quem vai ser o ganhador de um leilao que nao tiver nenhum lance?
E você nao tem que decidir você mesmo arbitrariamente.
É claro que as vezes estamos pressionado por prazo do projeto
por tudo mais.Querendo que vc termina e a gente acaba tomando decisoes
arbitrarias
Essa é uma decisão que ddeve ser tomada por alguem q é dona
do produto, por quem é dona do Bancklog(PO)
Pessoa que sabe do negócio
Ai vamos considerer que ele falou que quando n tiver ganhador
vai ter ganhador é o valor 0
Ganhador = Lances
.OrderBy(l => l.Valor)
.LastOrDefault();
//para
Ganhador = Lances
.DefaultIfEmpty(new Lance(null,0)) //vai retornar este obj quando estiver vazio
.OrderBy(l => l.Valor)
.LastOrDefault();
+++++++++++++=
++++++++++++++
Vale a pena estudar a API do .NET
para ser mais rápido na hora de criar testes
olha o exemplo acima
------------------------------
Teorizando com xUnit
------------------------------
Então, será que o xUnit ajuda a reduzir nosso código para uma
classe de equivalência, sim
O XUNIT TEM UM RECURSO CHAMADO DE [TEORIA]
ONDE VOCÊ PODE FAZER UMA BRINCADEIRA COM TESTES QUE NÓS TEMOS
+++
Mas no outro tem 4 testes que queremos reduzir para um só
para isso
trocamos o atributo [Fact] para o [Theory]
e essa notaçao vai transformar esse método a partir de algumas
coisas que temos q fazer
Quando fazemos isso vamos ter um erro de compilacao
- o motivo é que temos de passar vários dados de test,
por exemplo lances ordenados, lances desordenados,lances com
mais de um cliente, leilao com apenas um lance
[Theory]
public void LeilaoComVariosLances()
[Theory]
[InlineData(new double[] {800, 900, 1000, 1200})]
[InlineData(new double[] { 800, 900, 1000, 990 })]
[InlineData(new double[] { 800 })]
public void LeilaoComVariosLances(double[] ofertas )
++++
SE EU QUISER PASSAR DADOS DE ENTRADA USAMOS A NOTAÇAO
[THEORY] ,SE EU NAO IMPORTAR OS DADOS DE ENTRADA QUE VAI PASSAR
A EXPECTATIVA VAI SER SEMPRE A MESMA, NOS USAMOS A NOTAÇAO
[FACT]
[Theory]
[InlineData(1200, new double[] {800, 900, 1000, 1200})]
[InlineData(1000, new double[] { 800, 900, 1000, 990 })]
[InlineData(800, new double[] { 800 })]
public void LeilaoComVariosLances(double valorEsperado,double[] ofertas )
{
Assert.Equal(valorObtido, valorEsperado);
aí é meio que considerado como um teste apenas
EXEMPLO
[Theory]
[InlineData(7, 2, 5)
public void RetornaSomaDeDoisNumeros(int resultadoEsperado, int num1, int num2)
{
//Act
var resultadoObtido = num1 + num2;
//Assert
Assert.Equal(resultadoEsperado, resultadoObtido);
}
------------------------------
Nomenclatura
------------------------------
Diretrizes da Microsoft
CENARIO3
DADO LEILÃO FINALIZADO COM X LANCES
QUANDO LEILAO RECEBE NOVA OFERTA DE LANCE
eNTÃO A QTD DE LANCES CONTINUA SENDO X
+++
ESTE CENÁRIO NUMERO 3 É UMA NOVA CLASSE DE EQUIVALENCIA?????
r:é NÃO
ATÉ PQ NAO ESTA TESTANDO O MESMO MÉTODO,POIS NAO ESTA TESTANDO MAIS
O TERMINA PREGAO
VOU TESTAR O OFERTADELEILAO
É UMA NOVA CLASSE DE EUQIVALENCIA PARA O NOVO METODO
MAS NAO DO ANTIGO
//Assert
var valorEsperado = 2;
var valorObtido = leilao.Lances.Count();
Assert.Equal(valorEsperado, valorObtido);
}
}
------------------------------
O que aprendemos?
------------------------------
---------------------------------------------------------
03.Não deixe o sistema regredir
---------------------------------------------------------
------------------------------
Manutenção dos testes
------------------------------
+++++++++++++
MUITAS VEZES NOS MUDAMOS O COMPARTAMENTO E ALGUNS TESTES DEIXAM DE PASSAR
MUITAS VEZES ALGUNS TEM QUE SER REMOVIDOS DA SUA SWITCH DE TESTE,
POIS ELES NÃO FAZEM MAIS SENTIDO
ALGUNS TEM QUE SER MODIFICADOS, MANTIDOS
+++++++++++++++++++
DAÍ A IMPORTANCIA DE VOCÊ TER CÓDIGO DE QUALIDADE EM SEUS TESTES
+++
COMO EU GARANTO A DISCIPLINA DE SEMPRE TER TESTES PARA FUNCIONALIDADES
QUE CRIE?
------------------------------
Novos testes a cada funcionalidade
------------------------------
+++++++++++++++++++++
Teste para cada nova funcionalidade
-ratica de ter um testador , equipe de teste, uma equipe de QA
Essa equipe fica posicionada justamente para testar os incrementos do
software que você faz que o desenvolvedor cria. Eles pegam incrementos
de software e realizam testes a partir disso aí.
Então é uma prática comum e deia o desenvolvedor confortável
em até não fazer testes.Pq ele sabe que alguém vai pegar
esses problemas que ele pode ter injetado.Pode
ter feito o sistema regredir.
Testes automaticos que estam rodando em nossa máquina dão um
feedback basicamente imediato. De que se o nosso sistema regrediu ou não
Isso faz que meu foco continue sendo ainda, naquela funcionalidade
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++
AO INVÉS DE DESENVOLVER E DEPOIS TESTAR
PRIMEIRO A GENTE CRIA OS TESTES E DEPOIS DESENVOLVE
FAMOSO TDD
PRIMEIRO PENSAMOS EM NO MINIMO UM CENÁRIO E CRIAMOS
O TESTE E ESSE TESTE VAI FALHAR PORQUE VOCÊ NÃO ESCREVEU
CÓDIGO AINDA. AÍ SIM A GENTE VAI FAZER OS TESTES FUNCIONAIS
ESCREVENDO A FUNCIONALIDADE
VAMOS TENTAR FAZER ISSO EM UMA PRÓXIMA FUNCIONALIDADE
++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++
PRATICA CONTRA INTUITIVA, EM QUE PRIMEIRO VOCE CRIA OS TESTES E DEPOIS
AS PRATICAS DE NEGÓCIO.
ESSA PRÁTICA É MUITO ITILIZADA NOS TIMES ÁGEIS
E É CHAMA DE TESTE DRIVEN DEVELOPMENT - TDD
PORQUE É O DESENVOLVIMENTO QUE ESTÁ DIRIGIDO PELOS
TESTES
DESENVOLVIMENTO ORIENTADO PELOS TESTES
DESENVOLVIMENTO QUE SERÁ ORIENTADO PELOS TESTES QUE ESTÃO FALHANDO
------------------------------
Praticando TDD
------------------------------
[Fact]
public void NaoAceitaProximoLanceDadoMesmoClienteRealizouUltimoLance()
{
//Arranje-Cenário
var leilao = new Leilao("Van Gogh");
var fulano = new Interessada("Fulano", leilao);
leilao.IniciaPregao();
leilao.RecebeLance(fulano, 800);
//Assert
var qtdeEsperada = 1;
var qtdeObtida = leilao.Lances.Count();
Assert.Equal(qtdeEsperada, qtdeObtida);
}
E VAI FALHAR
entao vamos escrever o codigo de produção
++++
MAS NÃO ADIANTA EXECUTAR APENAS O TESTE NOVO,
TEM QUE EXECUTAR TODA SWITCH DE TESTES
++++++++
AÍ NOVAMENTES OS TESTES VOLTARAM A FALHAR , E ISSO PORQUE O MEU CENÁRIO
MUDOU
++++++++++++++++++++++++++++=
O TDD
NÓS DÁ A DISCIPLINA DE SEMPRE PENSAR NOS TESTES PRIMEIRO
------------------------------
Melhorando nosso código
------------------------------
E AGORA, COMO FAZEMOS PARA TESTAR MÉTODOS PRIVADOS UMA VEZ QUE
ELES NÃO SAO VISIVEIS NA CLASSE DE TESTE???????
POR UM LINK DA MICROSOFT ELE DIZ QUE NA MAIORIA DAS VEZES
VOCE NAO VAI TER NECESSIDADE DE TESTAR UM MÉTODO PRIVADO
E DIZEM QUE EM ALGUM MOMENTO AQUELE MÉTODO PRIVADO VAI SER
SENSIBILIZADO POR UM MÉTODO PÚBLICO
E O MÉTODO PUBLICO VAI ESTAR SENSIBILIZANDO O METODO PRIVADO
+++++++++++++++++++++++++++++++
ENTAO ELE FEZ UMA MELHORIA NO NOSSO CÓDIGO SEM MUDAR ELE EXTERNAMENTE
E QUANDO A PESSOA FAZ ISSO DIZEMOS QUE ELE FEZ UMA REFATORAÇAO
MUDAR O SISTEMA INTERNAMENTE SEM MUDAR O COMPORTAMENTO EXTERNO
SENDO ISSO NOS ENCERRAMOS O CICLO DO TDD
------------------------------
O que aprendemos?
------------------------------
---------------------------------------------------------
04.Testando todos os comportamentos
---------------------------------------------------------
------------------------------
Terminando leilão sem pregão
------------------------------
aí criaremos
[Fact]
public void LancaInvalidOperationExceptionDadoPregaonaoIniciado()
++++++++
Agora queremos testar se uma exceçao foi lançada
[Fact]
public void LancaInvalidOperationExceptionDadoPregaonaoIniciado()
{
//Arranje-Cenário
var leilao = new Leilao("Van Gogh");
try
{
//Act - método sob teste
leilao.TerminaPregao();
}
catch(System.Exception e)
{
//Assert
Assert.IsType<System.InvalidOperationException>(e);
}
}
++++MAS DESSE JEITO VAI PASSAR O TESTE PQ ELE NAO PEGA A EXCEÇAO
O leilao.TerminaPregao();NAO LANCA EXCEÇAO
PARA ISSO PRECISAMOS FAZER UMA GAMBIARRA
[Fact]
public void LancaInvalidOperationExceptionDadoPregaonaoIniciado()
{
//Arranje-Cenário
var leilao = new Leilao("Van Gogh");
try
{
//Act - método sob teste
leilao.TerminaPregao();
Assert.True(false);
}
catch(System.Exception e)
{
//Assert
Assert.IsType<System.InvalidOperationException>(e);
}
}
MAS SERÁ QUE TEM UMA FORMA MAIS INTERESSANTE DE TESTAR EXCEÇOES COM
XUNIT??
------------------------------
Exceções com xUnit
------------------------------
[Fact]
public void LancaInvalidOperationExceptionDadoPregaonaoIniciado()
{
//Arranje-Cenário
var leilao = new Leilao("Van Gogh");
try
{
//Act - método sob teste
leilao.TerminaPregao();
Assert.True(false);
}
catch(System.Exception e)
{
//Assert
Assert.IsType<System.InvalidOperationException>(e);
}
}
PARA ->
[Fact]
public void LancaInvalidOperationExceptionDadoPregaonaoIniciado()
{
//Arranje-Cenário
var leilao = new Leilao("Van Gogh");
//Assert
Assert.Throws<System.InvalidOperationException>(
//Act método sob teste
() =>leilao.TerminaPregao()//passar como delegate
);
}
aí modificamos
//colocando a exceçao
[Fact]
public void LancaInvalidOperationExceptionDadoPregaonaoIniciado()
{
//Arranje-Cenário
var leilao = new Leilao("Van Gogh");
//Assert
var excecaoObtida = Assert.Throws<System.InvalidOperationException>(
//Act método sob teste
() =>leilao.TerminaPregao()//passar como delegate
);
//--------
var msgEsperada = "Não é possível terminar o pregão tenha começado.
Para isso, utilize o método IniciaPregão";
Assert.Equal(msgEsperada, excecaoObtida.Message);
}
------------------------------
Testando outra exceção
------------------------------
namespace Alura.LeilaoOnline.Tests
{
public class LanceCtor
{
[Fact]
public void LancaArgumentExceptionDadoValorNegativo()
{
//Arranje
var valorNegativo = -100;
//Assert
Assert.Throws<System.ArgumentException>(
//Act
() => new Lance(null, valorNegativo)
);
}
}
}
------------------------------
------------------------------
Referências Utilizadas
------------------------------
https://xunit.github.io/docs/comparisons
https://docs.microsoft.com/en-us/visualstudio/test/using-code-coverage-to-
determine-how-much-code-is-being-tested
https://www.martinfowler.com/bliki/TestCoverage.html
------------------------------
O que aprendemos
------------------------------
descobriu que exceções também são comportamentos do sistema e também devem ser
testadas
conheceu o método Assert.Throws<>() que permite verifica
r a expectativa de lançamento de determinada exceção
---------------------------------------------------------
05. Ajudando no design do código
---------------------------------------------------------
------------------------------
Outra forma de avaliar o leilão
------------------------------
[Theory]
[InlineData(1200,1250,new double[] { 800,1150,1400,1250})]
public void RetornaValorSuperiorMaisProximoDadoLeilaoNessaModalidade(
double valorDestino,
double valorEsperado,
double[] ofertas)
{
//Arranje
var leilao = new Leilao("Van Gogh");
var fulano = new Interessada("Fulano", leilao);
var maria = new Interessada("Maria", leilao);
//Act
leilao.TerminaPregao();
//Assert
Assert.Equal(valorEsperado, leilao.Ganhador.Valor);
}
------------------------------
Objetivos da aula
------------------------------
------------------------------
Teste ajudam o design
------------------------------
OU seja, até agora não precisamos mudar como que a gente, interagia com
leilao.
++++++++++
O processo em que vc planeja como um objeto vai interagir com outro
Isso é chamado de design
+++++++++++++++++
++++++++++++++++
OS TESTES ESTÃO AJUDANDO A VALIDAR O DESIGN DAS MINHAS CLASSES.
A INTERFACE
------------------------------
REferencias Utilizadas
------------------------------
++++++++++++++++
Talk de Michael Feathers sobre como testes melhoram o design
[voltar]