Testar uma biblioteca de classes .NET usando o Visual Studio
Importante
A Microsoft anunciou a desativação do Visual Studio para Mac. O Visual Studio para Mac não terá mais suporte a partir de 31 de agosto de 2024. As alternativas incluem:
- O Visual Studio Code com o Kit de Desenvolvimento em C# e extensões relacionadas, como .NET MAUI e Unity.
- Visual Studio em execução no Windows em uma VM no Mac.
- Visual Studio em execução no Windows em uma VM na Nuvem.
Para obter mais informações, confira o comunicado de desativação do Visual Studio para Mac.
Este tutorial mostra como automatizar o teste de unidade adicionando um projeto de teste a uma solução.
Pré-requisitos
- Este tutorial funciona com a solução que você cria em Criar uma biblioteca de classes do .NET usando o Visual Studio para Mac.
Criar um projeto de teste de unidade
As unidade de teste fornecem testes de software automatizados durante o desenvolvimento e a publicação. MSTest é uma das três estruturas de teste que você pode escolher. As outras são xUnit e nUnit.
Inicie o Visual Studio para Mac.
Abra a solução
ClassLibraryProjects
criada em Criar uma biblioteca de classes do .NET usando o Visual Studio para Mac.No painel Solução, pressione ctrl e clique na solução
ClassLibraryProjects
e selecione Adicionar>Novo Projeto.Na caixa de diálogo Novo Projeto, selecione Testes no nó Web e Console. Selecione o Projeto MSTest e depois Avançar.
Selecione .NET 5.0 como a Estrutura de Destino e selecione Avançar.
Nomeie o novo projeto como "StringLibraryTest" e selecione Criar.
O Visual Studio cria um arquivo de classe com o seguinte código:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
O código-fonte criado pelo modelo de teste de unidade faz o seguinte:
- Ele importa o namespace Microsoft.VisualStudio.TestTools.UnitTesting, que contém os tipos usados para o teste de unidade.
- Ele aplica o atributoTestClassAttribute à classe
UnitTest1
. - Ele aplica o atributo TestMethodAttribute para
TestMethod1
.
Cada método marcado com [TestMethod] em uma classe de teste marcada com [TestClass] é executado automaticamente quando o teste de unidade é executado.
Adicionar uma referência ao projeto
Para que o projeto de teste funcione com a classe StringLibrary
, adicione uma referência ao projeto StringLibrary
.
No painel Solução , pressione ctrl e clique em Dependências em StringLibraryTest. Selecione Adicionar referências no menu de contexto.
Na caixa de diálogo Referências , selecione o projeto StringLibrary . Selecione OK.
Adicionar e executar métodos de teste de unidade
Quando o Visual Studio executa um teste de unidade, ele executa cada método marcado com o atributo TestMethodAttribute em uma classe marcada com o atributo TestClassAttribute. Um método de teste termina quando a primeira falha é encontrada ou quando todos os testes contidos no método têm êxito.
Os testes mais comuns chamam membros da classe Assert. Muitos métodos assert incluem pelo menos dois parâmetros, um deles é o resultado esperado do teste, e o outro é o resultado real do teste. Alguns dos métodos chamados com mais frequência da classe Assert
são mostrados na tabela a seguir:
Métodos assert | Função |
---|---|
Assert.AreEqual |
Verifica se os dois valores ou objetos são iguais. O assert falha se os valores ou objetos não forem iguais. |
Assert.AreSame |
Verifica se duas variáveis de objeto se referem ao mesmo objeto. A assert falhará se as variáveis se referirem a objetos diferentes. |
Assert.IsFalse |
Verifica se uma condição é false . O assert falhará se a condição for true . |
Assert.IsNotNull |
Verifica se um objeto não é null . A assert falhará se o objeto for null . |
Você também pode usar o método Assert.ThrowsException em um método de teste para indicar o tipo de exceção que ele deve gerar. O teste falhará se a exceção especificada não for lançada.
Ao testar o método StringLibrary.StartsWithUpper
, você quer fornecer um número de cadeias de caracteres que comecem com um caractere maiúsculo. Você espera que o método retorne true
nesses casos, para que possa chamar o método Assert.IsTrue. Da mesma forma, você deseja fornecer um número de cadeias de caracteres que comecem com algo diferente de um caractere maiúsculo. Você espera que o método retorne false
nesses casos, para que possa chamar o método Assert.IsFalse.
Como seu método de biblioteca lida com cadeias de caracteres, convém ter certeza de que ele manipulará com êxito uma cadeia de caracteres vazia (String.Empty
), uma cadeia de caracteres válida sem caracteres e cujo Length é 0 e uma cadeia de caracteres null
que não foi inicializada. Você pode chamar StartsWithUpper
diretamente como um método estático e passar um único argumento String. Ou você pode chamar StartsWithUpper
como um método de extensão em uma variável string
atribuída a null
.
Você definirá três métodos, cada um deles chamará um método Assert para cada elemento em uma matriz de cadeia de caracteres. Você chamará uma sobrecarga de método que permite especificar uma mensagem de erro a ser exibida em caso de falha no teste. A mensagem identifica a cadeia de caracteres que causou a falha.
Para criar os métodos de teste:
Abra o arquivo UnitTest1.cs e substitua o código pelo seguinte código:
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
O teste de caracteres maiúsculos no método
TestStartsWithUpper
inclui a letra maiúscula grega alfa (U+0391) e a letra maiúscula cirílica EM (U+041C). O teste de caracteres minúsculos no métodoTestDoesNotStartWithUpper
inclui a letra minúscula grega alfa (U+03B1) e a letra minúscula cirílica Ghe (U+0433).Na barra de menus, selecione Arquivo>Salvar como. Na caixa de diálogo, verifique se a Codificação está definida como Unicode (UTF-8).
Quando for perguntado se deseja substituir o arquivo existente, selecione Substituir.
Se você não salvar seu código-fonte como um arquivo codificado em UTF8, o Visual Studio poderá salvá-lo como um arquivo ASCII. Quando isso acontecer, o runtime não decodificará de forma precisa os caracteres UTF8 fora do intervalo ASCII e os resultados de teste não serão corretos.
Abra o painel Testes de Unidade no lado direito da tela. Selecione Exibir>Testes no menu.
Clique no ícone Dock para manter o painel aberto.
Clique no botão Executar Tudo.
Todos os testes serão aprovados.
Identificar falhas de teste
Se você estiver fazendo o TDD (Desenvolvimento Orientado por Testes), você grava os testes primeiro e eles falharão na execução. Em seguida, você adiciona o código ao aplicativo que faz com que o teste seja bem-sucedido. Neste tutorial, você criou o teste depois de gravar o código do aplicativo que ele valida, portanto, você não viu o teste falhar. Para validar se um teste falha conforme o esperado, adicione um valor inválido à entrada de teste.
Modifique a matriz
words
no métodoTestDoesNotStartWithUpper
para incluir a cadeia de caracteres “Error”. Não é necessário salvar o arquivo porque o Visual Studio salva automaticamente os arquivos abertos quando uma solução é criada para executar testes.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Execute os testes novamente.
Dessa vez, a Janela Gerenciador de Testes indica que dois testes tiveram êxito e um falhou.
Pressione ctrl e clique no teste com falha,
TestDoesNotStartWithUpper
, e selecione Mostrar painel de resultados no menu de contexto.O painel de Resultados mostra a mensagem produzida pelo assert: "Assert.IsFalse falhou. Esperado para 'Error': false, real: True". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.
Remova a cadeia de caracteres "Error" que você adicionou na etapa 1. Execute novamente o teste, e ele será aprovado.
Testar a versão de lançamento da biblioteca
Agora que todos os nossos testes foram aprovados ao executar a compilação de Depuração da biblioteca, execute os testes mais uma vez na compilação de Lançamento da biblioteca. Vários fatores, incluindo as otimizações do compilador, podem produzir um comportamento diferente entre as compilações de Depuração e Lançamento.
Para testar a compilação de Lançamento:
Na barra de ferramentas do Visual Studio, altere a configuração de compilação de Depurar para Lançamento.
No painel Solução, pressione ctrl e clique no projeto StringLibrary; selecione Compilar no menu de contexto para compilar a biblioteca novamente.
Execute os testes de unidade novamente.
Os testes são aprovados.
Depurar testes
Se você estiver usando o Visual Studio para Mac como seu IDE, será possível usar o mesmo processo mostrado no Tutorial: Depurar um aplicativo de console do .NET usando o Visual Studio para Mac para depurar o código usando seu projeto de teste de unidade. Em vez de iniciar o projeto do aplicativo ShowCase, pressione ctrl e clique com no projeto StringLibraryTests e selecione Iniciar depuração do projeto no menu de contexto.
O Visual Studio inicia o projeto de teste com o depurador anexado. A execução será interrompida em qualquer ponto de interrupção adicionado ao projeto de teste ou ao código da biblioteca subjacente.
Recursos adicionais
Próximas etapas
Neste tutorial, você testou uma biblioteca de classes. Você pode disponibilizar a biblioteca para outras pessoas publicando-a no NuGet como um pacote. Para saber como, siga um tutorial do NuGet:
Se você publicar uma biblioteca como um pacote NuGet, outras pessoas poderão instalá-la e usá-la. Para saber como, siga um tutorial do NuGet:
Uma biblioteca não precisa ser distribuída como um pacote. Ela pode ser empacotada com um aplicativo de console que a usa. Para saber como publicar um aplicativo de console, consulte o tutorial anterior nesta série:
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de