visual-studio-2015

É inegável que os testes unitários representam uma importante ferramenta na obtenção de códigos com uma maior qualidade. Embora isto seja um fato de conhecimento geral, ainda existem resistências quanto à adoção deste tipo de prática. Dentre os motivos que contribuem para isto estão prazos apertados para a entrega de projetos ou, mesmo, a falta de conhecimentos adequados de alguns profissionais quanto aos benefícios decorrentes desta abordagem.

Atenta a tudo isto, a Microsoft disponibilizou no Visual Studio 2015 uma funcionalidade que busca agilizar a montagem e execução de testes unitários: trata-se de um recurso conhecido como “Smart Unit Tests”. Partindo do uso de técnicas de análise de código, este novo mecanismo é capaz gerar com um simples clique de mouse testes para todos os caminhos lógicos existentes dentro de um método/função. Até mesmo exceções e checagens realizadas por meio da classe Assert (namespace Microsoft.VisualStudio.TestTools.UnitTesting.Assert) são levadas em consideração na elaboração de casos de teste.

A intenção deste artigo é demonstrar o funcionamento dos Smart Unit Tests no Visual Studio 2015, através de um exemplo apresentado em detalhes na próxima seção.

Exemplo de utilização dos Smart Unit Tests

Para implementar o exemplo aqui discutido foram utilizados os seguintes recursos:

  • O Microsoft Visual Studio 2015 CTP 6 como IDE de desenvolvimento;
  • O .NET Framework 4.6.

A fim de demonstrar o uso dos Smart Unit Tests, será criado um projeto do tipo “Class Library” chamado “Utils.Math” (como indicado na Imagem 1).

smarttests-01
Imagem 1. Criando o projeto Utils.Math

No projeto Utils.Math estará a implementação da classe MathExtensions, cujo código pode ser observado na Listagem 1:

  • Neste tipo foi definido o método Fatorial, cuja função é calcular o valor do fatorial de um número inteiro;
  • Caso o parâmetro informado a esta operação seja um número negativo, uma exceção do tipo ArgumentOutOfRangeException (namespace System) será lançada.
using System;

namespace Utils.Math
{
    public static class MathExtensions
    {
        public static int Fatorial(int num)
        {
            if (num < 0)
                throw new ArgumentOutOfRangeException("Argumento inválido!");

            if (num == 0)
                return 1;

            int resultado = 1;
            for (int i = num; i > 1; i--)
                resultado = resultado * i;

            return resultado;
        }
    }
}

Listagem 1: Classe MathExtensions

O próximo passo agora será clicar com o botão direito sobre o método Fatorial, selecionando em seguida a opção “Smart Unit Tests” (Imagem 2).

smarttests-02
Imagem 2. Selecionando a opção “Smart Unit Tests”

Aparecerá então a janela “Smart Unit Tests Exploration” (Imagem 3), com parâmetros para testes que exercitam os diferentes caminhos de execução da operação Fatorial.

smarttests-03
Imagem 3. Janela “Smart Unit Tests Exploration”

Ao se clicar em um destes testes serão exibidos detalhes acerca do mesmo (como indicado na Imagem 4).

smarttests-04
Imagem 4. Detalhamento de um Smart Unit Test

É possível ainda salvar as diferentes checagens que constam na janela “Smart Unit Tests Exploration”, a partir da seleção de cada caso gerado (Imagem 5). O objetivo disto é permitir que se verifique a validade de uma ou mais funcionalidades, diante de eventuais mudanças que venham a ocorrer no futuro. O resultado deste procedimento será a criação de um projeto chamado “Utils.Math.Tests”, o qual poderá ser utilizado posteriormente em testes de regressão (Imagem 6).

smarttests-05
Imagem 5. Salvando os Smart Unit Tests gerados

smarttests-06
Imagem 6. Projeto criado ao salvar os Smart Unit Tests gerados anteriormente

Analisando a estrutura do projeto Utils.Math.Tests nota-se a presença da classe MathExtensionsTest. Os arquivos com a implementação deste tipo fazem uso do framework Visual Studio Unit Testing e do mecanismo conhecido como Pex (este último é uma solução da Microsoft voltada a testes, tendo por finalidade identificar todos os caminhos lógicos em uma função submetida à análise):

  • MathExtensionsTest.cs (Imagem 7): define um método para invocação da operação Fatorial da classe MathExtensions, sendo usado na execução dos diferentes casos de teste;
  • MathExtensionsTest.Fatorial.g.cs (Imagem 8): código com os diferentes casos de teste que foram salvos anteriormente.

smarttests-07
Imagem 7. Arquivo MathExtensionsTest.cs

smarttests-08
Imagem 8. Arquivo MathExtensionsTest.Fatorial.g.cs

A execução dos testes especificados no projeto Utils.Math.Tests segue o mesmo processo das versões anteriores do Visual Studio, podendo ser acionada a partir do menu de atalho no editor de código (Imagem 9). O resultado desse procedimento estará disponível para visualização na janela “Test Explorer” (Imagem 10).

smarttests-09
Imagem 9. Execução de testes unitários

smarttests-10
Imagem 10. Resultado da execução dos testes unitários

Conclusão

A ideia deste post foi apresentar o mecanismo conhecido como Smart Unit Tests, o qual representa mais uma das novas funcionalidades que integram o Visual Studio 2015. Buscando cobrir o maior número possível de caminhos lógicos em um trecho de código a ser analisado, este recurso oferece uma alternativa extremamente ágil para a geração automática de casos de teste.

Espero que o conteúdo aqui apresentado tenha sido útil.

Até uma próxima oportunidade!

Links

Build Better Software with Smart Unit Tests
https://msdn.microsoft.com/en-us/magazine/dn904672.aspx

Generate smart unit tests for your code
https://msdn.microsoft.com/en-us/library/dn823749(v=vs.140).aspx

Introducing Smart Unit Tests
http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/19/introducing-smart-unit-tests.aspx

Smart Unit Tests – a mental model
http://blogs.msdn.com/b/visualstudioalm/archive/2014/12/11/smart-unit-tests-a-mental-model.aspx

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Comentários

comentarios