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:

FerramentaComo é conferida
Calculadora de JurosOs 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 ParcelamentoO 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 CRC32O CRC32 é comparado com o zlib do Node.js e reproduz o valor de conferência do padrão: CBF43926 para o texto 123456789.
Calcular IdadeO 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 BancosA 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 ExteriorO 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 HSLAs 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 FeriadosOs 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 DatasA diferença em anos, meses e dias é comparada com o relativedelta, da biblioteca dateutil (Python), em 2.000 pares de datas sorteadas.
Diff de TextoO 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 PIXCada chave gerada passa no validador de chaves Pix da biblioteca validation-br.
Gerador de CNHOs 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 HashOs 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 HMACO 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 MD5O 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óriosUm 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/PASEPOs 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ículosAs 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 CodeCada 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 PIXOs 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-FiO 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 301O 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 RENAVAMOs 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.txtO 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 SHA1O SHA-1 é comparado com o módulo crypto do Node.js, em textos e dados de vários tamanhos.
Gerador de SHA256O SHA-256 é comparado com o módulo crypto do Node.js, em textos e dados de vários tamanhos.
Gerador de Título de EleitorOs 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 DiferentesCada 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 ExtensoO 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 DatasA 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úmerosUm 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 BoletoAs 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 PIXAs 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 CNHO 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/PASEPO cálculo do dígito é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python.
Validador de RENAVAMO 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 EleitorO cálculo dos dígitos é comparado com duas bibliotecas independentes: a validation-br, em JavaScript, e a validate-docbr, em Python.
Verificador de ContrasteA 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.