Como testamos as ferramentas
Um gerador de CPF que erra o dígito, ou uma calculadora de juros que arredonda errado, é pior do que nenhuma ferramenta. Por isso, cada uma das 124 ferramentas e dos 36 guias do PraDev passa por testes automáticos, e boa parte delas é comparada com bibliotecas independentes, mantidas por outras pessoas e usadas em sistemas de verdade.
Testes automáticos a cada mudança
O código do site tem mais de 1.400 testes automáticos. Eles rodam automaticamente em cada proposta de mudança, num servidor de integração contínua, junto com o build do site. Os testes cobrem os cálculos, os formatos de entrada, as mensagens de erro e os casos de borda, como datas em 29 de fevereiro, números com resto 10 no dígito verificador e textos com acentos e emojis.
Comparação com bibliotecas independentes
Acertar os exemplos que nós mesmos escrevemos não basta: um erro de entendimento da regra passaria despercebido. Por isso, sempre que existe uma biblioteca reconhecida que faz a mesma conta, os testes comparam o resultado do PraDev com o dela, em centenas ou milhares de casos sorteados. Quando os dois discordam, a diferença é investigada antes de publicar.
Essa comparação já encontrou problemas em bibliotecas de terceiros, como uma biblioteca de boletos que não conferia o dígito verificador geral, e mostrou diferenças de convenção que viraram explicação nas páginas, como o 31 de janeiro mais um mês, que dá 28 de fevereiro no Python e 3 de março no JavaScript.
Estas são as ferramentas conferidas com uma referência externa, e como:
| Ferramenta | Como é conferida |
|---|---|
| Calculadora de Juros | Os juros compostos, com e sem aportes mensais, são comparados com a biblioteca numpy-financial (Python), usada em finanças, em 200 combinações de valor, taxa e prazo. |
| Calculadora de Parcelamento | O valor da parcela pela tabela Price e a taxa embutida são comparados com a biblioteca numpy-financial (Python) em 200 combinações de valor, taxa e prazo. |
| Calcular CRC32 | O CRC32 é comparado com o zlib do Node.js e reproduz o valor de conferência do padrão: CBF43926 para o texto 123456789. |
| Calcular Idade | O cálculo em anos, meses e dias usa a mesma conta da diferença entre datas, comparada com o relativedelta, da biblioteca dateutil (Python), em 2.000 pares de datas sorteadas. |
| Código dos Bancos | A lista vem dos participantes do STR do Banco Central, e um teste confere que os códigos são únicos e que o ISPB de cada instituição é a raiz do CNPJ dela. |
| Como Ligar para o Exterior | O DDI e o número de exemplo de mais de 200 países são comparados com a biblioteca phonenumbers (Python), a versão oficial da libphonenumber, do Google. |
| Conversor de Cores HEX RGB HSL | As conversões entre HEX, RGB, HSL, HSV e OKLCH são comparadas com a biblioteca culori em 400 cores sorteadas, e a leitura de cada sintaxe de cor do CSS também. |
| Decodificador de Chassi (VIN) | País de fabricação, dígito verificador e anos-modelo são comparados com a biblioteca vininfo (Python) em 1.500 chassis sorteados, e cada fabricante da lista é conferido com a mesma biblioteca. |
| Dias Úteis e Feriados | Os feriados nacionais são comparados com a biblioteca holidays (Python), e a data da Páscoa, base do Carnaval e da Sexta-feira Santa, com o dateutil.easter de 1900 a 2200. |
| Diferença entre Datas | A diferença em anos, meses e dias é comparada com o relativedelta, da biblioteca dateutil (Python), em 2.000 pares de datas sorteadas. |
| Diff de Texto | O tamanho de cada diferença encontrada é comparado com um cálculo independente da maior subsequência comum, por programação dinâmica, em 2.000 pares de textos sorteados. |
| Gerador de Chave PIX | Cada chave gerada passa no validador de chaves Pix da biblioteca validation-br. |
| Gerador de CNH | Os números gerados e o cálculo dos dígitos são comparados com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python, em milhares de números sorteados. |
| Gerador de Hash | Os hashes são comparados com o módulo crypto do Node.js, em textos e dados de vários tamanhos, inclusive com acentos e emojis. |
| Gerador de HMAC | O HMAC reproduz os vetores oficiais das RFC 2202 e 4231 e é comparado com o createHmac do Node.js em cada algoritmo, com chaves e mensagens de vários tamanhos. |
| Gerador de MD5 | O MD5 é comparado com o módulo crypto do Node.js, em textos e dados de vários tamanhos, inclusive com acentos e emojis. |
| Gerador de Números Aleatórios | Um teste estatístico (qui-quadrado) confere que todos os números do intervalo saem com a mesma frequência, e outros testes cobrem os limites e o modo sem repetição. |
| Gerador de PIS/PASEP | Os números gerados e o cálculo do dígito são comparados com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python. |
| Gerador de Placa de Veículos | As placas geradas e a leitura de formato são comparadas com a biblioteca validation-br, e a conversão para o Mercosul é testada com os dez números da tabela. |
| Gerador de QR Code | Cada QR Code gerado é lido de volta com a biblioteca jsQR, nos quatro níveis de correção de erro, inclusive com acentos e emojis. |
| Gerador de QR Code PIX | Os códigos gerados passam no validador de Pix copia e cola da biblioteca validation-br, o exemplo do manual do Banco Central é reproduzido exatamente, e cada QR Code é lido de volta com a biblioteca jsQR, como faria a câmera. |
| Gerador de QR Code Wi-Fi | O QR Code gerado é lido de volta com a biblioteca jsQR, e o texto WIFI: é conferido com nomes e senhas que têm os caracteres especiais do formato. |
| Gerador de Redirect 301 | O código PHP gerado é executado nos testes e redireciona de verdade, e as regras do Apache são conferidas com expressões regulares no Python para garantir que só o caminho exato é redirecionado. |
| Gerador de RENAVAM | Os RENAVAM gerados passam na validation-br, e o cálculo do dígito é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python, em milhares de números sorteados. |
| Gerador de Robots.txt | O teste de endereço é comparado com o Protego, leitor de robots.txt que segue o padrão do Google, em mais de 5 mil combinações de regras, robôs e endereços. |
| Gerador de SHA1 | O SHA-1 é comparado com o módulo crypto do Node.js, em textos e dados de vários tamanhos. |
| Gerador de SHA256 | O SHA-256 é comparado com o módulo crypto do Node.js, em textos e dados de vários tamanhos. |
| Gerador de Título de Eleitor | Os números gerados e o cálculo dos dígitos, inclusive as regras de São Paulo e Minas Gerais, são comparados com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python. |
| Letras Diferentes | Cada letra gerada é conferida no banco de dados Unicode (módulo unicodedata, do Python): ela precisa existir e ter o nome esperado, como MATHEMATICAL BOLD CAPITAL A. |
| Número por Extenso | O texto por extenso é comparado com duas bibliotecas: a extenso (JavaScript), inclusive em reais e centavos, e a num2words (Python), em centenas de números sorteados. |
| Somar Dias em Datas | A soma de meses é comparada com o relativedelta, da biblioteca dateutil (Python), em datas sorteadas, inclusive as que caem em dia 29, 30 e 31. |
| Sorteador de Números | Um teste estatístico (qui-quadrado) confere que cada número que ainda não saiu tem a mesma chance, e outro sorteia o intervalo inteiro para garantir que nada se repete. |
| Validador de Boleto | As linhas digitáveis são comparadas com duas bibliotecas, a validation-br e a boleto-utils, em centenas de boletos de teste, inclusive os de arrecadação (contas de consumo e tributos). |
| Validador de Chave PIX | As chaves de cada tipo (CPF, CNPJ, e-mail, celular e aleatória) são comparadas com o validador de chaves Pix da biblioteca validation-br. |
| Validador de CNH | O cálculo dos dígitos é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python, em milhares de números sorteados, inclusive os casos com resto 10. |
| Validador de PIS/PASEP | O cálculo do dígito é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python. |
| Validador de RENAVAM | O cálculo do dígito é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python, em milhares de números sorteados, inclusive no formato antigo de 9 dígitos. |
| Validador de Título de Eleitor | O cálculo dos dígitos é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python. |
| Verificador de Contraste | A razão de contraste é comparada com a função wcagContrast da biblioteca culori em 200 pares de cores sorteadas. |
Código que roda de verdade
Os exemplos de código dos guias e das 36 ferramentas que trazem a seção "Em código", em JavaScript, Python e PHP, ficam em arquivos separados que os testes executam. Cada exemplo precisa dar o mesmo resultado que a ferramenta do site. Assim, nenhum trecho publicado está sem teste, e um erro de digitação no exemplo quebra o teste antes de chegar à página.
Números das páginas e fontes
Os exemplos citados no texto das páginas, como "70 kg e 1,75 m dão IMC 22,9", também são conferidos pelos testes, para o texto e a ferramenta nunca discordarem. Quando um cálculo segue uma regra oficial, como as faixas de IMC da OMS ou o padrão do Pix do Banco Central, a página traz o link para a fonte.
Navegador, celular e acessibilidade
Cada página nova é aberta num navegador de verdade, em tela de celular e de computador, para conferir que a ferramenta funciona e que nada passa da largura da tela. As páginas também passam pelo Lighthouse, do Google, que avalia velocidade, acessibilidade e boas práticas.
O que os testes não garantem
- Dados que mudam com o tempo, como a lista de bancos e os DDIs, vêm de fontes públicas e podem ficar desatualizados entre uma revisão e outra.
- Calculadoras de saúde, como IMC, água e gasto calórico, usam equações reconhecidas, mas dão estimativas, que não substituem a avaliação de um profissional.
- Documentos gerados para testes são válidos no cálculo, mas não existem em nenhum cadastro oficial.
Encontrou um erro?
Cada ferramenta tem o link "Avise por e-mail" logo abaixo dela, e também dá para escrever pela página de contato. Quando um erro de cálculo é corrigido, ele ganha um teste novo, para não voltar. Para saber quem mantém o site, veja a página Sobre.