Tutorial: testar uma biblioteca de classes .NET usando o Visual Studio Code

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

As unidade de teste fornecem testes de software automatizados durante o desenvolvimento e a publicação. A estrutura de teste usada neste tutorial é o MSTest. MSTest é uma das três estruturas de teste que você pode escolher. As outras são xUnit e nUnit.

  1. Inicie o Visual Studio Code.

  2. Abra a solução ClassLibraryProjects criada em Criar uma biblioteca de classes .NET usando o Visual Studio Code.

  3. Crie um projeto de teste de unidade chamado "StringLibraryTest".

    dotnet new mstest -o StringLibraryTest
    

    O modelo de projeto cria um arquivo UnitTest1.cs com o código a seguir:

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

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

  4. Adicione o projeto de teste à solução.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Adicionar uma referência ao projeto

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

  1. Execute o comando a seguir:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

Adicionar e executar métodos de teste de unidade

Quando o Visual Studio invoca 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 o método de biblioteca processa cadeias de caracteres, também convém verificar se ele processa com êxito uma cadeia de caracteres vazia (String.Empty) e uma cadeia de caracteres null. Uma cadeia de caracteres vazia é aquela que não tem caracteres e cujo Length é 0. Uma cadeia de caracteres null é aquela que não foi inicializada. Você pode chamar StartsWithUpper diretamente como um método estático e passar um só 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:

  1. Abra StringLibraryTest/UnitTest1.cs e substitua todo o código pelo código a seguir.

    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étodo TestDoesNotStartWithUpper inclui a letra minúscula grega alfa (U+03B1) e a letra minúscula cirílica Ghe (U+0433).

  2. Salve suas alterações.

  3. Execute os testes:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    A saída do terminal mostra que todos os testes foram aprovados.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net8.0)
    

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

  1. Modifique a matriz words no método TestDoesNotStartWithUpper para incluir a cadeia de caracteres “Error”.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Execute os testes:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    A saída do terminal mostra que um teste falha e fornece uma mensagem de erro para o teste com falha: "Falha em Assert.IsFalse. Esperado para 'Error': false, real: True". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. 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.

  1. Execute os testes com a configuração de build de lançamento:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    Os testes são aprovados.

Depurar testes

Se você estiver usando o Visual Studio Code como IDE, use o mesmo processo mostrado em Depurar um aplicativo de console .NET usando o Visual Studio Code para depurar o código usando seu projeto de teste de unidade. Em vez de iniciar o projeto de aplicativo ShowCase, abra StringLibraryTest/UnitTest1.cs e selecione Depurar Todos os Testes entre as linhas 7 e 8. Se não for possível encontrá-lo, pressione Ctrl+Shift+P para abrir a paleta de comandos e insira Recarregar Janela.

O Visual Studio Code inicia o projeto de teste com o depurador anexado. A execução será interrompida em algum 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, confira o tutorial anterior nesta série:

A extensão Kit de desenvolvimento do C# do Visual Studio Code fornece mais ferramentas para o desenvolvimento de aplicativos e bibliotecas em C#:

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

As unidade de teste fornecem testes de software automatizados durante o desenvolvimento e a publicação. A estrutura de teste usada neste tutorial é o MSTest. MSTest é uma das três estruturas de teste que você pode escolher. As outras são xUnit e nUnit.

  1. Inicie o Visual Studio Code.

  2. Abra a solução ClassLibraryProjects criada em Criar uma biblioteca de classes .NET usando o Visual Studio Code.

  3. Crie um projeto de teste de unidade chamado "StringLibraryTest".

    dotnet new mstest -o StringLibraryTest
    

    O modelo de projeto cria um arquivo UnitTest1.cs com o código a seguir:

    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:

    Cada método marcado com [TestMethod] em uma classe de teste marcada com [TestClass] é executado automaticamente quando o teste de unidade é invocado.

  4. Adicione o projeto de teste à solução.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Adicionar uma referência ao projeto

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

  1. Execute o comando a seguir:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

Adicionar e executar métodos de teste de unidade

Quando o Visual Studio invoca 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 o método de biblioteca processa cadeias de caracteres, também convém verificar se ele processa com êxito uma cadeia de caracteres vazia (String.Empty) e uma cadeia de caracteres null. Uma cadeia de caracteres vazia é aquela que não tem caracteres e cujo Length é 0. Uma cadeia de caracteres null é aquela que não foi inicializada. Você pode chamar StartsWithUpper diretamente como um método estático e passar um só 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:

  1. Abra StringLibraryTest/UnitTest1.cs e substitua todo o código pelo código a seguir.

    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étodo TestDoesNotStartWithUpper inclui a letra minúscula grega alfa (U+03B1) e a letra minúscula cirílica Ghe (U+0433).

  2. Salve suas alterações.

  3. Execute os testes:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    A saída do terminal mostra que todos os testes foram aprovados.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net7.0)
    

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

  1. Modifique a matriz words no método TestDoesNotStartWithUpper para incluir a cadeia de caracteres “Error”.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Execute os testes:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    A saída do terminal mostra que um teste falha e fornece uma mensagem de erro para o teste com falha: "Falha em Assert.IsFalse. Esperado para 'Error': false, real: True". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. 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.

  1. Execute os testes com a configuração de build de lançamento:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    Os testes são aprovados.

Depurar testes

Se você estiver usando o Visual Studio Code como IDE, use o mesmo processo mostrado em Depurar um aplicativo de console .NET usando o Visual Studio Code para depurar o código usando seu projeto de teste de unidade. Em vez de iniciar o projeto de aplicativo ShowCase, abra StringLibraryTest/UnitTest1.cs e selecione Depurar Todos os Testes entre as linhas 7 e 8. Se não for possível encontrá-lo, pressione Ctrl+Shift+P para abrir a paleta de comandos e insira Recarregar Janela.

O Visual Studio Code inicia o projeto de teste com o depurador anexado. A execução será interrompida em algum 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, confira o tutorial anterior nesta 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

As unidade de teste fornecem testes de software automatizados durante o desenvolvimento e a publicação. A estrutura de teste usada neste tutorial é o MSTest. MSTest é uma das três estruturas de teste que você pode escolher. As outras são xUnit e nUnit.

  1. Inicie o Visual Studio Code.

  2. Abra a solução ClassLibraryProjects criada em Criar uma biblioteca de classes .NET usando o Visual Studio Code.

  3. Crie um projeto de teste de unidade chamado "StringLibraryTest".

    dotnet new mstest -f net6.0 -o StringLibraryTest
    

    O comando -f net6.0 altera a estrutura de destino padrão para a versão net6.0.

    O comando -o ou --output especifica o local para colocar a saída gerada.

    O modelo de projeto cria um arquivo UnitTest1.cs com o código a seguir:

    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:

    Cada método marcado com [TestMethod] em uma classe de teste marcada com [TestClass] é executado automaticamente quando o teste de unidade é invocado.

  4. Adicione o projeto de teste à solução.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Adicionar uma referência ao projeto

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

  1. Execute o comando a seguir:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

Adicionar e executar métodos de teste de unidade

Quando o Visual Studio invoca 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 o método de biblioteca processa cadeias de caracteres, também convém verificar se ele processa com êxito uma cadeia de caracteres vazia (String.Empty) e uma cadeia de caracteres null. Uma cadeia de caracteres vazia é aquela que não tem caracteres e cujo Length é 0. Uma cadeia de caracteres null é aquela que não foi inicializada. Você pode chamar StartsWithUpper diretamente como um método estático e passar um só 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:

  1. Abra StringLibraryTest/UnitTest1.cs e substitua todo o código pelo código a seguir.

    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étodo TestDoesNotStartWithUpper inclui a letra minúscula grega alfa (U+03B1) e a letra minúscula cirílica Ghe (U+0433).

  2. Salve suas alterações.

  3. Execute os testes:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    A saída do terminal mostra que todos os testes foram aprovados.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net6.0)
    

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

  1. Modifique a matriz words no método TestDoesNotStartWithUpper para incluir a cadeia de caracteres “Error”.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Execute os testes:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    A saída do terminal mostra que um teste falha e fornece uma mensagem de erro para o teste com falha: "Falha em Assert.IsFalse. Esperado para 'Error': false, real: True". Devido à falha, nenhuma cadeia de caracteres na matriz após "Error" foi testada.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. 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.

  1. Execute os testes com a configuração de build de lançamento:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    Os testes são aprovados.

Depurar testes

Se você estiver usando o Visual Studio Code como IDE, use o mesmo processo mostrado em Depurar um aplicativo de console .NET usando o Visual Studio Code para depurar o código usando seu projeto de teste de unidade. Em vez de iniciar o projeto de aplicativo ShowCase, abra StringLibraryTest/UnitTest1.cs e selecione Depurar Todos os Testes entre as linhas 7 e 8. Se não for possível encontrá-lo, pressione Ctrl+Shift+P para abrir a paleta de comandos e insira Recarregar Janela.

O Visual Studio Code inicia o projeto de teste com o depurador anexado. A execução será interrompida em algum 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, confira o tutorial anterior nesta série: