BLOG

Como o Test-Driven Development (TDD) e a engenharia de prompt melhoraram o desenvolvimento de software

Conheça o conceito e os benefícios do Test-Driven Development (TDD), enquanto aprende a usar a StackSpot AI para criar testes unitários.

Combinada com metodologias como o Test-Driven Development (TDD), a engenharia de prompt potencializa muito o trabalho de quem desenvolve, proporcionando uma experiência de desenvolvimento mais ágil e eficiente.

Ao dominar a engenharia de prompt, profissionais de tecnologia exploram todo o potencial de ferramentas como a StackSpot AI, que compreendem comandos e se adaptam ao estilo de cada pessoa. Comandos claros e precisos garantem resultados ainda melhores.

Neste artigo, exploraremos a cooperação entre a inteligência artificial generativa e o desenvolvimento de software, com foco na utilização de testes unitários como prompts para a geração de código. Através de um exemplo prático, demonstraremos como a StackSpot AI pode otimizar o processo de desenvolvimento e garantir a qualidade do software, com metodologias como o Test-Driven Development (TDD).

O que é Test Driven Development (TDD)?

Projetos de software de grande porte exigem rigor e precisão. O Test-Driven Development (TDD) é uma metodologia que eleva a qualidade do código e promove a excelência técnica.

No Test-Driven Development, os testes são escritos antes da implementação, orientando o desenvolvimento e garantindo que o código sempre atenda aos requisitos. Essa abordagem fortalece a confiança da equipe, acelera o desenvolvimento e facilita a colaboração.

Ao adotar o Test-Driven Development, as equipes garantem que o software seja mais robusto, mais fácil de manter e altamente confiável. Ao garantir um código de alta qualidade, o TDD contribui para uma experiência das pessoas usuárias mais satisfatória e estável.

Benefícios do Test-Driven Development (TDD)

Os benefícios de adotar o Test-Driven Development (TDD) no desenvolvimento de software são muitos. A seguir, destacamos os principais:

  • Código de alta qualidade: Ao escrever os testes antes, a pessoa desenvolvedora se concentra em criar código que atenda aos requisitos específicos dos testes, resultando em um código mais limpo;
  • Melhoria da arquitetura: O Test-Driven Development (TDD) incentiva a criação de um design modular e testável, tornando a manutenção e a refatoração do código mais simples e seguras;
  • Documentação viva: Os testes servem como uma documentação executável do comportamento esperado do código, tornando mais fácil entender e modificar o sistema no futuro;
  • Aumento da confiança: Ao ter um conjunto de testes abrangente, as pessoas desenvolvedoras podem fazer alterações no código com mais confiança, sabendo que os testes irão identificar qualquer regressão;
  • Código sempre funcionando: O ciclo de fail-pass-refactoring garante que o código está quase sempre funcionando, e é mais fácil debugar.

Testes como prompt

A StackSpot AI se destaca por permitir que testes unitários substituam a necessidade de traduzir ideias complexas para uma linguagem natural, que pode ser ambígua. Ao fornecer um teste, quem desenvolve mostra à IA exatamente o comportamento esperado de uma função ou classe.

Essa abordagem se assemelha a dar um desenho técnico para um profissional da arquitetura: o desenho detalha exatamente como a construção deve ser.

Com a StackSpot AI, a comunicação entre pessoa desenvolvedora e máquina se torna mais direta e eficiente, através da engenharia de prompt, resultando em um processo de desenvolvimento mais ágil e preciso.

Um exemplo prático

Agora que já conhecemos as vantagens do Test-Driven Development (TDD) é hora de ver na prática como a StackSpot AI pode ajudar neste processo. 

O problema

Para essa demonstração, vamos criar um arquivo de testes unitários em Python e esse arquivo será o input que a StackSpot AI usará para gerar o código.

Problema: gostaria de ter uma classe que encapsula um número e faça a conversão bidirecional entre as representações em números arábicos e caracteres romanos.

Esse é o código de teste:

import unittest
 
class RomanNumeralTest(unittest.TestCase):
    def test_should_create_roman_numeral_object_from_int(self):
        actual_numerals = [RomanNumeral(i).as_roman() for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,200, 300, 400,500, 600, 700, 800, 900, 1000]]
        expected_numerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XX","XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C", "CC", "CCC", "CD", "D","DC", "DCC", "DCCC", "DCCCC", "M"]
        self.assertListEqual(expected_numerals, actual_numerals)
 

    def test_should_create_roman_numeral_object_from_string(self):
        actual_numerals = [RomanNumeral(s).as_arabic() for s in ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C", "CC", "CCC", "CD", "D","DC", "DCC", "DCCC", "DCCC", "M"]]
        expected_numerals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]
        self.assertListEqual(expected_numerals, actual_numerals)
 
if __name__ == '__main__':
    unittest.main()

Aprimorando o teste

Vamos solicitar uma análise de code smells. Para isso, clique com o botão direito do mouse dentro da área de edição de código. Um menu vai aparecer; é o menu de contexto. Nesse menu, vou até StackSpot AI. Um submenu vai aparecer, com a opção “Is there any code smell in this code?“. Basta selecionar essa opção.

Imagem capa do conteúdo sobre Test-Driven Development (TDD), onde há um menu de contexto com a opção Stackspot Ai, e submenu com a opção "Is there any code small in this code?"

Essa é a resposta:

Com base no trecho de código fornecido, não é possível dizer com certeza se há bugs ou code smells porque a implementação da classe RomanNumeral não é fornecida. No entanto, existem algumas observações e possíveis problemas que podem ser apontados:

1. A classe RomanNumeral não é importada ou definida no trecho de código, o que resultaria em um NameError ao tentar instanciar RomanNumeral(i) ou RomanNumeral(s).

2. Há um possível erro de digitação na lista de números esperados para a representação em algarismo romano de 900. Ele está listado como “DCCCC”, mas o algarismo romano correto para 900 é “CM”.

3. O código não segue o guia de estilo PEP 8 para código Python, que recomenda duas linhas em branco antes das definições de classe.

StackSpot AI sugere o seguinte código, corrigindo os pontos levantados:

import unittest

# Assuming the RomanNumeral class is defined in roman_numeral.py
from roman_numeral import RomanNumeral

class RomanNumeralTest(unittest.TestCase):
    def test_should_create_roman_numeral_object_from_int(self):
        actual_numerals = [RomanNumeral(i).as_roman() for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]]
        expected_numerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "M"]  # Corrected "DCCCC" to "CM"
        self.assertListEqual(expected_numerals, actual_numerals)

    def test_should_create_roman_numeral_object_from_string(self):
        actual_numerals = [RomanNumeral(s).as_arabic() for s in ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "M"  # Assuming "CM" is the correct representation for 900]]
        expected_numerals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]
        self.assertListEqual(expected_numerals, actual_numerals)

if __name__ == '__main__':
    unittest.main()

Vamos aceitar as correções e prosseguir.

É interessante que a StackSpot AI tem conhecimento de temas que extrapolam o escopo do desenvolvimento de software, como numeração romana.

Gerando o código

Entro com o seguinte prompt: 

“Forneça uma implementação da classe RomanNumeral que faça os testes passarem.”

A StackSpot AI trouxe de resposta:

class RomanNumeral:
    def __init__(self, value):
        if isinstance(value, int):
            self.value = value
        elif isinstance(value, str):
            self.value = self._from_roman(value)
        else:
            raise TypeError("Value must be an integer or a string representing a Roman numeral.")

    def as_roman(self):
        return self._to_roman(self.value)

    def as_arabic(self):
        return self.value

    @staticmethod
    def _to_roman(number):
        roman_numerals = {1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC', 50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'}
        result = ""
        for value, numeral in sorted(roman_numerals.items(), reverse=True):
            while number >= value:
                result += numeral
                number -= value
        return result

    @staticmethod
    def _from_roman(roman):
        roman_numerals = {'M': 1000, 'CM': 900, 'D': 500, 'CD': 400, 'C': 100, 'XC': 90, 'L': 50, 'XL': 40, 'X': 10, 'IX': 9, 'V': 5, 'IV': 4, 'I': 1}
        index = 0
        number = 0
        while index < len(roman):
            if (index + 1 < len(roman)) and (roman[index:index+2] in roman_numerals):
                number += roman_numerals[roman[index:index+2]]
                index += 2
            else:
                number += roman_numerals[roman[index]]
                index += 1
        return number

A StackSpot fornece ainda a orientação de colocar o código no arquivo roman_numeral.py. Ao executar os testes, temos resultado positivo em ambos.

Conclusão

No exemplo prático da conversão de números romanos, StackSpot AI demonstrou ser uma colaboradora valiosa ao identificar e corrigir os problemas no código de testes, além de gerar o código de produção esperado. 

Essa colaboração entre pessoa e máquina acelerou o processo de desenvolvimento e resultou em um código mais limpo, eficiente e confiável.

A capacidade da StackSpot AI em gerar código de alta qualidade com base em testes unitários abre novas possibilidades para o futuro do desenvolvimento de software.

Confira a documentação da StackSpot AI aqui.

Ficou com alguma dúvida ou tem sugestões? Então deixe um comentário.

Posts relacionados

Continue explorando a StackSpot AI

Ícone de uma Folha de Documentos, na cor laranja vibrante, sobre fundo transparente.

Cases

Confira como impulsionamos negócios com soluções que economizam tempo.

Ícone de um Livro, na cor laranja vibrante, sobre fundo transparente.

Imprensa

Confira as últimas notícias, conteúdos e destaques da StackSpot na mídia.

Ícone de uma Pasta de documentos, na cor laranja vibrante, sobre fundo transparente.

Docs

Tudo o que você precisa para dominar a StackSpot AI, de forma simples e em um só lugar.

Ícone de uma Pessoa representando um Usuário, na cor laranja vibrante, sobre fundo transparente.

Sobre

Sua plataforma de agentes inteligentes para todo o ciclo de desenvolvimento.

Receba a nossa newsletter

Compartilhamos insights, artigos e conteúdos relevantes sobre tecnologia. Uma vez por mês, sem encher sua caixa de entrada.