Partilhar via


Tutorial: Testar uma biblioteca de classes .NET com .NET usando o Visual Studio

Este tutorial mostra como automatizar o teste de unidade adicionando um projeto de teste a uma solução.

Pré-requisitos

Criar um projeto de teste de unidade

Os testes de unidade fornecem testes automatizados de software durante o desenvolvimento e a publicação. MSTest é uma das três estruturas de teste que você pode escolher. Os outros são xUnit e nUnit.

  1. Inicie o Visual Studio.

  2. Abra a solução que você criou em Criar uma biblioteca de classes .NET usando o ClassLibraryProjects Visual Studio.

  3. Adicione um novo projeto de teste de unidade chamado "StringLibraryTest" à solução.

    1. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e selecione Adicionar>Novo projeto.

    2. Na página Adicionar um novo projeto, digite mstest na caixa de pesquisa. Escolha C# ou Visual Basic na lista Linguagem e, em seguida, escolha Todas as plataformas na lista Plataforma.

    3. Escolha o modelo MSTest Test Project e, em seguida, escolha Next.

    4. Na página Configurar seu novo projeto, digite StringLibraryTest na caixa Nome do projeto. Em seguida, escolha Avançar.

    5. Na página Informações adicionais, selecione .NET 8 (Visualização) na caixa Estrutura. Em seguida, escolha Criar.

  4. Visual Studio cria o projeto e abre o arquivo de classe na janela de código com o código a seguir. Se o idioma que pretende utilizar não for apresentado, altere o seletor de idioma na parte superior da página.

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

    O código-fonte criado pelo modelo de teste de unidade faz o seguinte:

    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 de projeto

Para que o projeto de teste funcione com a StringLibrary classe, adicione uma referência no projeto StringLibraryTest ao StringLibrary projeto.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nó Dependências do projeto StringLibraryTest e selecione Adicionar Referência de Projeto no menu de contexto.

  2. Na caixa de diálogo Gerenciador de referências, expanda o nó Projetos e selecione a caixa ao lado deStringLibrary. Adicionar uma referência ao StringLibrary assembly permite que o compilador encontre métodos StringLibrary durante a compilação do projeto StringLibraryTest .

  3. 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 em uma classe marcada com o TestMethodAttributeTestClassAttribute atributo. Um método de teste termina quando a primeira falha é encontrada ou quando todos os testes contidos no método foram bem-sucedidos.

Os testes mais comuns chamam membros da Assert classe. Muitos métodos de afirmação incluem pelo menos dois parâmetros, um dos quais é o resultado esperado do teste e o outro é o resultado real do teste. Alguns dos métodos mais frequentemente chamados da Assert classe são mostrados na tabela a seguir:

Métodos de afirmação Função
Assert.AreEqual Verifica se dois valores ou objetos são iguais. A declaração falhará se os valores ou objetos não forem iguais.
Assert.AreSame Verifica se duas variáveis de objeto se referem ao mesmo objeto. A asserção falhará se as variáveis se referirem a objetos diferentes.
Assert.IsFalse Verifica se uma condição é false. A asserção falhará se a condição for true.
Assert.IsNotNull Verifica se um objeto não nullé . A declaração falhará se o objeto for null.

Você também pode usar o método em um método de teste para indicar o Assert.ThrowsException tipo de exceção que se espera que ele lance. O teste falhará se a exceção especificada não for lançada.

Ao testar o StringLibrary.StartsWithUpper método, você deseja fornecer várias cadeias de caracteres que começam com um caractere maiúsculo. Você espera que o método retorne true nesses casos, para que você possa chamar o Assert.IsTrue método. Da mesma forma, você deseja fornecer várias cadeias de caracteres que começam com algo diferente de um caractere maiúsculo. Você espera que o método retorne false nesses casos, para que você possa chamar o Assert.IsFalse método.

Como seu método de biblioteca lida com cadeias de caracteres, você também deseja certificar-se de que ele manipula com êxito uma cadeia de caracteres vazia (String.Empty), uma cadeia de caracteres válida que não tem caracteres e cuja Length é 0 e uma null cadeia de caracteres que não foi inicializada. Você pode chamar StartsWithUpper diretamente como um método estático e passar um único String argumento. Ou você pode chamar StartsWithUpper como um método de extensão em uma string variável atribuída a null.

Você definirá três métodos, cada um dos quais chama um Assert método 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:

  1. Na janela de código UnitTest1.cs ou UnitTest1.vb, substitua o código pelo seguinte código:

    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));
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    O teste de caracteres maiúsculos TestStartsWithUpper no método 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 TestDoesNotStartWithUpper no método inclui a letra pequena grega alfa (U+03B1) e a letra pequena cirílica Ghe (U+0433).

  2. Na barra de menus, selecione File Save UnitTest1.cs As ou File>>Save UnitTest1.vb As. Na caixa de diálogo Salvar arquivo como, selecione a seta ao lado do botão Salvar e selecione Salvar com codificação.

    Visual Studio Save File As dialog

  3. Na caixa de diálogo Confirmar Salvar como, selecione o botão Sim para salvar o arquivo.

  4. Na caixa de diálogo Opções avançadas de salvamento, selecione Unicode (UTF-8 com assinatura) - Codepage 65001 na lista suspensa Codificação e selecione OK.

    Visual Studio Advanced Save Options dialog

    Se você não conseguir salvar o código-fonte como um arquivo codificado em UTF8, o Visual Studio poderá salvá-lo como um arquivo ASCII. Quando isso acontece, o tempo de execução não decodifica com precisão os caracteres UTF8 fora do intervalo ASCII e os resultados do teste não estarão corretos.

  5. Na barra de menus, selecione Test>Run All Tests. Se a janela Test Explorer não abrir, abra-a escolhendo Test>Explorer. Os três testes são listados na seção Testes aprovados e a seção Resumo relata o resultado da execução do teste.

    Test Explorer window with passing tests

Lidar com falhas de teste

Se você estiver fazendo desenvolvimento orientado a testes (TDD), você escreve testes primeiro e eles falham na primeira vez que você os executa. Em seguida, você adiciona código ao aplicativo que faz o teste ser bem-sucedido. Para este tutorial, você criou o teste depois de escrever o código do aplicativo que ele valida, para que você não tenha visto o teste falhar. Para validar que um teste falha quando você espera que ele falhe, adicione um valor inválido à entrada de teste.

  1. Modifique a wordsTestDoesNotStartWithUpper matriz no método para incluir a cadeia de caracteres "Error". Você não precisa 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", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Execute o teste selecionando Test>Run All Tests na barra de menus. A janela Test Explorer indica que dois testes foram bem-sucedidos e um falhou.

    Test Explorer window with failing tests

  3. Selecione o teste reprovado, TestDoesNotStartWith.

    A janela Test Explorer exibe a mensagem produzida pela assert: "Assert.IsFalse falhou. Esperado para 'Erro': false; atual: Verdadeiro". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.

    Test Explorer window showing the IsFalse assertion failure

  4. Remova a cadeia de caracteres "Erro" que você adicionou na etapa 1. Execute novamente o teste e os testes são aprovados.

Testar a versão Release da biblioteca

Agora que todos os testes passaram ao executar a compilação Debug da biblioteca, execute os testes um tempo adicional em relação à compilação Release da biblioteca. Vários fatores, incluindo otimizações do compilador, às vezes podem produzir um comportamento diferente entre as compilações Debug e Release.

Para testar a compilação de versão:

  1. Na barra de ferramentas do Visual Studio, altere a configuração de compilação de Debug para Release.

    Visual Studio toolbar with release build highlighted

  2. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto StringLibrary e selecione Construir no menu de contexto para recompilar a biblioteca.

    StringLibrary context menu with build command

  3. Execute os testes de unidade escolhendo Test>Run All Tests na barra de menus. Os testes são aprovados.

Testes de depuração

Se você estiver usando o Visual Studio como seu IDE, poderá usar o mesmo processo mostrado em Tutorial: Depurar um aplicativo de console .NET usando o Visual Studio para depurar código usando seu projeto de teste de unidade. Em vez de iniciar o projeto do aplicativo ShowCase, clique com o botão direito do mouse no projeto StringLibraryTests e selecione Depurar testes no menu de contexto.

Visual Studio inicia o projeto de teste com o depurador anexado. A execução será interrompida em qualquer ponto de interrupção que você adicionou ao projeto de teste ou ao código da biblioteca subjacente.

Recursos adicionais

Próximos passos

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. Ele pode ser empacotado com um aplicativo de console que o usa. Para saber como publicar um aplicativo de console, consulte o tutorial anterior desta série:

Este tutorial mostra como automatizar o teste de unidade adicionando um projeto de teste a uma solução.

Pré-requisitos

Criar um projeto de teste de unidade

Os testes de unidade fornecem testes automatizados de software durante o desenvolvimento e a publicação. MSTest é uma das três estruturas de teste que você pode escolher. Os outros são xUnit e nUnit.

  1. Inicie o Visual Studio.

  2. Abra a solução que você criou em Criar uma biblioteca de classes .NET usando o ClassLibraryProjects Visual Studio.

  3. Adicione um novo projeto de teste de unidade chamado "StringLibraryTest" à solução.

    1. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e selecione Adicionar>Novo projeto.

    2. Na página Adicionar um novo projeto, digite mstest na caixa de pesquisa. Escolha C# ou Visual Basic na lista Linguagem e, em seguida, escolha Todas as plataformas na lista Plataforma.

    3. Escolha o modelo MSTest Test Project e, em seguida, escolha Next.

    4. Na página Configurar seu novo projeto, digite StringLibraryTest na caixa Nome do projeto. Em seguida, escolha Avançar.

    5. Na página Informações adicionais, selecione .NET 7 (Suporte de prazo padrão) na caixa Estrutura. Em seguida, escolha Criar.

  4. Visual Studio cria o projeto e abre o arquivo de classe na janela de código com o código a seguir. Se o idioma que pretende utilizar não for apresentado, altere o seletor de idioma na parte superior da página.

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

    O código-fonte criado pelo modelo de teste de unidade faz o seguinte:

    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 de projeto

Para que o projeto de teste funcione com a StringLibrary classe, adicione uma referência no projeto StringLibraryTest ao StringLibrary projeto.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nó Dependências do projeto StringLibraryTest e selecione Adicionar Referência de Projeto no menu de contexto.

  2. Na caixa de diálogo Gerenciador de referências, expanda o nó Projetos e selecione a caixa ao lado deStringLibrary. Adicionar uma referência ao StringLibrary assembly permite que o compilador encontre métodos StringLibrary durante a compilação do projeto StringLibraryTest .

  3. 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 em uma classe marcada com o TestMethodAttributeTestClassAttribute atributo. Um método de teste termina quando a primeira falha é encontrada ou quando todos os testes contidos no método foram bem-sucedidos.

Os testes mais comuns chamam membros da Assert classe. Muitos métodos de afirmação incluem pelo menos dois parâmetros, um dos quais é o resultado esperado do teste e o outro é o resultado real do teste. Alguns dos métodos mais frequentemente chamados da Assert classe são mostrados na tabela a seguir:

Métodos de afirmação Função
Assert.AreEqual Verifica se dois valores ou objetos são iguais. A declaração falhará se os valores ou objetos não forem iguais.
Assert.AreSame Verifica se duas variáveis de objeto se referem ao mesmo objeto. A asserção falhará se as variáveis se referirem a objetos diferentes.
Assert.IsFalse Verifica se uma condição é false. A asserção falhará se a condição for true.
Assert.IsNotNull Verifica se um objeto não nullé . A declaração falhará se o objeto for null.

Você também pode usar o método em um método de teste para indicar o Assert.ThrowsException tipo de exceção que se espera que ele lance. O teste falhará se a exceção especificada não for lançada.

Ao testar o StringLibrary.StartsWithUpper método, você deseja fornecer várias cadeias de caracteres que começam com um caractere maiúsculo. Você espera que o método retorne true nesses casos, para que você possa chamar o Assert.IsTrue método. Da mesma forma, você deseja fornecer várias cadeias de caracteres que começam com algo diferente de um caractere maiúsculo. Você espera que o método retorne false nesses casos, para que você possa chamar o Assert.IsFalse método.

Como seu método de biblioteca lida com cadeias de caracteres, você também deseja certificar-se de que ele manipula com êxito uma cadeia de caracteres vazia (String.Empty), uma cadeia de caracteres válida que não tem caracteres e cuja Length é 0 e uma null cadeia de caracteres que não foi inicializada. Você pode chamar StartsWithUpper diretamente como um método estático e passar um único String argumento. Ou você pode chamar StartsWithUpper como um método de extensão em uma string variável atribuída a null.

Você definirá três métodos, cada um dos quais chama um Assert método 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:

  1. Na janela de código UnitTest1.cs ou UnitTest1.vb, 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));
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    O teste de caracteres maiúsculos TestStartsWithUpper no método 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 TestDoesNotStartWithUpper no método inclui a letra pequena grega alfa (U+03B1) e a letra pequena cirílica Ghe (U+0433).

  2. Na barra de menus, selecione File Save UnitTest1.cs As ou File>>Save UnitTest1.vb As. Na caixa de diálogo Salvar arquivo como, selecione a seta ao lado do botão Salvar e selecione Salvar com codificação.

    Visual Studio Save File As dialog

  3. Na caixa de diálogo Confirmar Salvar como, selecione o botão Sim para salvar o arquivo.

  4. Na caixa de diálogo Opções avançadas de salvamento, selecione Unicode (UTF-8 com assinatura) - Codepage 65001 na lista suspensa Codificação e selecione OK.

    Visual Studio Advanced Save Options dialog

    Se você não conseguir salvar o código-fonte como um arquivo codificado em UTF8, o Visual Studio poderá salvá-lo como um arquivo ASCII. Quando isso acontece, o tempo de execução não decodifica com precisão os caracteres UTF8 fora do intervalo ASCII e os resultados do teste não estarão corretos.

  5. Na barra de menus, selecione Test>Run All Tests. Se a janela Test Explorer não abrir, abra-a escolhendo Test>Explorer. Os três testes são listados na seção Testes aprovados e a seção Resumo relata o resultado da execução do teste.

    Test Explorer window with passing tests

Lidar com falhas de teste

Se você estiver fazendo desenvolvimento orientado a testes (TDD), você escreve testes primeiro e eles falham na primeira vez que você os executa. Em seguida, você adiciona código ao aplicativo que faz o teste ser bem-sucedido. Para este tutorial, você criou o teste depois de escrever o código do aplicativo que ele valida, para que você não tenha visto o teste falhar. Para validar que um teste falha quando você espera que ele falhe, adicione um valor inválido à entrada de teste.

  1. Modifique a wordsTestDoesNotStartWithUpper matriz no método para incluir a cadeia de caracteres "Error". Você não precisa 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", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Execute o teste selecionando Test>Run All Tests na barra de menus. A janela Test Explorer indica que dois testes foram bem-sucedidos e um falhou.

    Test Explorer window with failing tests

  3. Selecione o teste reprovado, TestDoesNotStartWith.

    A janela Test Explorer exibe a mensagem produzida pela assert: "Assert.IsFalse falhou. Esperado para 'Erro': false; atual: Verdadeiro". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.

    Test Explorer window showing the IsFalse assertion failure

  4. Remova a cadeia de caracteres "Erro" que você adicionou na etapa 1. Execute novamente o teste e os testes são aprovados.

Testar a versão Release da biblioteca

Agora que todos os testes passaram ao executar a compilação Debug da biblioteca, execute os testes um tempo adicional em relação à compilação Release da biblioteca. Vários fatores, incluindo otimizações do compilador, às vezes podem produzir um comportamento diferente entre as compilações Debug e Release.

Para testar a compilação de versão:

  1. Na barra de ferramentas do Visual Studio, altere a configuração de compilação de Debug para Release.

    Visual Studio toolbar with release build highlighted

  2. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto StringLibrary e selecione Construir no menu de contexto para recompilar a biblioteca.

    StringLibrary context menu with build command

  3. Execute os testes de unidade escolhendo Test>Run All Tests na barra de menus. Os testes são aprovados.

Testes de depuração

Se você estiver usando o Visual Studio como seu IDE, poderá usar o mesmo processo mostrado em Tutorial: Depurar um aplicativo de console .NET usando o Visual Studio para depurar código usando seu projeto de teste de unidade. Em vez de iniciar o projeto do aplicativo ShowCase, clique com o botão direito do mouse no projeto StringLibraryTests e selecione Depurar testes no menu de contexto.

Visual Studio inicia o projeto de teste com o depurador anexado. A execução será interrompida em qualquer ponto de interrupção que você adicionou ao projeto de teste ou ao código da biblioteca subjacente.

Recursos adicionais

Próximos passos

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. Ele pode ser empacotado com um aplicativo de console que o usa. Para saber como publicar um aplicativo de console, consulte o tutorial anterior desta série:

Este tutorial mostra como automatizar o teste de unidade adicionando um projeto de teste a uma solução.

Pré-requisitos

Criar um projeto de teste de unidade

Os testes de unidade fornecem testes automatizados de software durante o desenvolvimento e a publicação. MSTest é uma das três estruturas de teste que você pode escolher. Os outros são xUnit e nUnit.

  1. Inicie o Visual Studio.

  2. Abra a solução que você criou em Criar uma biblioteca de classes .NET usando o ClassLibraryProjects Visual Studio.

  3. Adicione um novo projeto de teste de unidade chamado "StringLibraryTest" à solução.

    1. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e selecione Adicionar>Novo projeto.

    2. Na página Adicionar um novo projeto, digite mstest na caixa de pesquisa. Escolha C# ou Visual Basic na lista Linguagem e, em seguida, escolha Todas as plataformas na lista Plataforma.

    3. Escolha o modelo MSTest Test Project e, em seguida, escolha Next.

    4. Na página Configurar seu novo projeto, digite StringLibraryTest na caixa Nome do projeto. Em seguida, escolha Avançar.

    5. Na página Informações adicionais, selecione .NET 6 (Suporte de longo prazo) na caixa Estrutura. Em seguida, escolha Criar.

  4. Visual Studio cria o projeto e abre o arquivo de classe na janela de código com o código a seguir. Se o idioma que pretende utilizar não for apresentado, altere o seletor de idioma na parte superior da página.

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

    O código-fonte criado pelo modelo de teste de unidade faz o seguinte:

    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 de projeto

Para que o projeto de teste funcione com a StringLibrary classe, adicione uma referência no projeto StringLibraryTest ao StringLibrary projeto.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nó Dependências do projeto StringLibraryTest e selecione Adicionar Referência de Projeto no menu de contexto.

  2. Na caixa de diálogo Gerenciador de referências, expanda o nó Projetos e selecione a caixa ao lado deStringLibrary. Adicionar uma referência ao StringLibrary assembly permite que o compilador encontre métodos StringLibrary durante a compilação do projeto StringLibraryTest .

  3. 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 em uma classe marcada com o TestMethodAttributeTestClassAttribute atributo. Um método de teste termina quando a primeira falha é encontrada ou quando todos os testes contidos no método foram bem-sucedidos.

Os testes mais comuns chamam membros da Assert classe. Muitos métodos de afirmação incluem pelo menos dois parâmetros, um dos quais é o resultado esperado do teste e o outro é o resultado real do teste. Alguns dos métodos mais frequentemente chamados da Assert classe são mostrados na tabela a seguir:

Métodos de afirmação Função
Assert.AreEqual Verifica se dois valores ou objetos são iguais. A declaração falhará se os valores ou objetos não forem iguais.
Assert.AreSame Verifica se duas variáveis de objeto se referem ao mesmo objeto. A asserção falhará se as variáveis se referirem a objetos diferentes.
Assert.IsFalse Verifica se uma condição é false. A asserção falhará se a condição for true.
Assert.IsNotNull Verifica se um objeto não nullé . A declaração falhará se o objeto for null.

Você também pode usar o método em um método de teste para indicar o Assert.ThrowsException tipo de exceção que se espera que ele lance. O teste falhará se a exceção especificada não for lançada.

Ao testar o StringLibrary.StartsWithUpper método, você deseja fornecer várias cadeias de caracteres que começam com um caractere maiúsculo. Você espera que o método retorne true nesses casos, para que você possa chamar o Assert.IsTrue método. Da mesma forma, você deseja fornecer várias cadeias de caracteres que começam com algo diferente de um caractere maiúsculo. Você espera que o método retorne false nesses casos, para que você possa chamar o Assert.IsFalse método.

Como seu método de biblioteca lida com cadeias de caracteres, você também deseja certificar-se de que ele manipula com êxito uma cadeia de caracteres vazia (String.Empty), uma cadeia de caracteres válida que não tem caracteres e cuja Length é 0 e uma null cadeia de caracteres que não foi inicializada. Você pode chamar StartsWithUpper diretamente como um método estático e passar um único String argumento. Ou você pode chamar StartsWithUpper como um método de extensão em uma string variável atribuída a null.

Você definirá três métodos, cada um dos quais chama um Assert método 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:

  1. Na janela de código UnitTest1.cs ou UnitTest1.vb, 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));
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    O teste de caracteres maiúsculos TestStartsWithUpper no método 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 TestDoesNotStartWithUpper no método inclui a letra pequena grega alfa (U+03B1) e a letra pequena cirílica Ghe (U+0433).

  2. Na barra de menus, selecione File Save UnitTest1.cs As ou File>>Save UnitTest1.vb As. Na caixa de diálogo Salvar arquivo como, selecione a seta ao lado do botão Salvar e selecione Salvar com codificação.

    Visual Studio Save File As dialog

  3. Na caixa de diálogo Confirmar Salvar como, selecione o botão Sim para salvar o arquivo.

  4. Na caixa de diálogo Opções avançadas de salvamento, selecione Unicode (UTF-8 com assinatura) - Codepage 65001 na lista suspensa Codificação e selecione OK.

    Visual Studio Advanced Save Options dialog

    Se você não conseguir salvar o código-fonte como um arquivo codificado em UTF8, o Visual Studio poderá salvá-lo como um arquivo ASCII. Quando isso acontece, o tempo de execução não decodifica com precisão os caracteres UTF8 fora do intervalo ASCII e os resultados do teste não estarão corretos.

  5. Na barra de menus, selecione Test>Run All Tests. Se a janela Test Explorer não abrir, abra-a escolhendo Test>Explorer. Os três testes são listados na seção Testes aprovados e a seção Resumo relata o resultado da execução do teste.

    Test Explorer window with passing tests

Lidar com falhas de teste

Se você estiver fazendo desenvolvimento orientado a testes (TDD), você escreve testes primeiro e eles falham na primeira vez que você os executa. Em seguida, você adiciona código ao aplicativo que faz o teste ser bem-sucedido. Para este tutorial, você criou o teste depois de escrever o código do aplicativo que ele valida, para que você não tenha visto o teste falhar. Para validar que um teste falha quando você espera que ele falhe, adicione um valor inválido à entrada de teste.

  1. Modifique a wordsTestDoesNotStartWithUpper matriz no método para incluir a cadeia de caracteres "Error". Você não precisa 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", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Execute o teste selecionando Test>Run All Tests na barra de menus. A janela Test Explorer indica que dois testes foram bem-sucedidos e um falhou.

    Test Explorer window with failing tests

  3. Selecione o teste reprovado, TestDoesNotStartWith.

    A janela Test Explorer exibe a mensagem produzida pela assert: "Assert.IsFalse falhou. Esperado para 'Erro': false; atual: Verdadeiro". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.

    Test Explorer window showing the IsFalse assertion failure

  4. Remova a cadeia de caracteres "Erro" que você adicionou na etapa 1. Execute novamente o teste e os testes são aprovados.

Testar a versão Release da biblioteca

Agora que todos os testes passaram ao executar a compilação Debug da biblioteca, execute os testes um tempo adicional em relação à compilação Release da biblioteca. Vários fatores, incluindo otimizações do compilador, às vezes podem produzir um comportamento diferente entre as compilações Debug e Release.

Para testar a compilação de versão:

  1. Na barra de ferramentas do Visual Studio, altere a configuração de compilação de Debug para Release.

    Visual Studio toolbar with release build highlighted

  2. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto StringLibrary e selecione Construir no menu de contexto para recompilar a biblioteca.

    StringLibrary context menu with build command

  3. Execute os testes de unidade escolhendo Test>Run All Tests na barra de menus. Os testes são aprovados.

Testes de depuração

Se você estiver usando o Visual Studio como seu IDE, poderá usar o mesmo processo mostrado em Tutorial: Depurar um aplicativo de console .NET usando o Visual Studio para depurar código usando seu projeto de teste de unidade. Em vez de iniciar o projeto do aplicativo ShowCase, clique com o botão direito do mouse no projeto StringLibraryTests e selecione Depurar testes no menu de contexto.

Visual Studio inicia o projeto de teste com o depurador anexado. A execução será interrompida em qualquer ponto de interrupção que você adicionou ao projeto de teste ou ao código da biblioteca subjacente.

Recursos adicionais

Próximos passos

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. Ele pode ser empacotado com um aplicativo de console que o usa. Para saber como publicar um aplicativo de console, consulte o tutorial anterior desta série: