Manual básico do JUnit

Alguns anos atrás comecei a estudar TDD e como desenvolvia principalmente em Java na época comecei a aprender um pouco mais sobre o JUnit, o principal framework de testes de unidade do Java e um dos primeiros de todas as linguagens. Para me ajudar eu criei um pequeno manual prático sobre ele: class SimpleSnipetJUnitTest { private Calculator calculator; /** * Este método é invocado antes de cada teste, a annotation * facilita isso */ @Before public void setUp() { //Tudo aqui será executado antes, servindo por exemplo para inicializar. calculator = new Calculator(); } /** * Este método é invocado após os testes, servindo, como exemplo, para liberar recursos. */ @After public void finalize() { } /** * Teste comum, o método assertEquals realiza a operação de teste de igualdade. */ @Test public void testeSimples() { int result; result = calculator.sum(1, 2); assertEquals(3, result); } /** * Teste para números de ponto flutuante. * Destaque para o terceiro parâmetro, o delta, que define * qual a diferença decimal entre cada parâmetro. */ @Test public void testeDePontoFlutuante() { float result; result = calculator.divide(5, 2); //O terceiro parâmetro é a diferença máxima entre os floats assertEquals(2.5, result, 0.1) } /** * Teste para exceções * Se não disparar a exceção, o método falha. */ @Test (expected= CalculatorException.class) public void testeDeExcecao() { int result; result = calculator.divide(5, 0); } }

14 de outubro de 2021 · 2 min de leitura · Lucas Polo

Fazendo upload de arquivos para o Google Cloud Storage com Python

Algum tempo atrás precisei aprender a fazer upload de arquivos para o Google Cloud Storage. Uma das coisas que eu gosto de fazer para me ajudar aprender a fazer algo é criar um scriptzinho com o conceito do que quero, sem aplicar em grandes projetos, evitando assim grandes complexidades. Assim na época eu criei este script simples que faz o upload do arquivo em um bucket do GCS. A primeira coisa que você precisa fazer é ter instalada a biblioteca, para isso temos o bom e velho pip: ...

11 de outubro de 2021 · 2 min de leitura · Lucas Polo

Medindo o tempo de aplicações de linha de comando

Vira e mexe precisamos testar o tempo de algo que roda em linha de comando, seja uma requisição através de cURL ou algum scripts/aplicação que construímos. O jeito mais simples e onipresente nas interfaces de linha de comando do Linux é o time. Ele executa o comando passado para ele através de parâmetro e diz qual foi o tempo de execução: Resultado da execução do time O time pode ajudar muito, principalmente quando queremos comparar escalas de tempo muito diferentes, por exemplo uma mudança de código que mudou o tempo de execução de 1s para 100ms. Porém como a medida pode variar muito de execução devido a diversos fatores (cache, resolução de DNS, etc) testar apenas uma única vez pode não trazer resultados muito acurados, pois não temos tempo médio nem a variância do tempo. Para isso encontrei uma outra aplicação chamada hyperfine. ...

7 de outubro de 2021 · 3 min de leitura · Lucas Polo

Casamento de padrões (Pattern Matching)

Há alguma tempo atrás eu aprendi um pouco de Scala, uma linguagem muito interessante que roda sobre a JVM. Apesar de ser muito similar ao Java a primeira vista logo depois de um pouco mais de aprendizado lidamos com recursos muito diferentes do que temos na linguagem mais velha. Um recurso que me surpreendeu foi o casamento de padrões, ou pattern matching em inglês e vou usa-la de exemplo aqui pois até onde conheço o pattern matching do Scala é um dos mais completos. Diversas outras linguagens implementam também o recurso de maneira similar e as vezes com um pouco menos de poder, por isso vale conferir a documentação antes de prosseguir. ...

4 de outubro de 2021 · 4 min de leitura · Lucas Polo

O novo (mas nem tanto) switch/case do Java

Recentemente voltei a mexer mais com Java devido ao trabalho e também alguns conteúdos que eu estava acompanhando que utilizam a linguagem. Como estou utilizando o IntelliJ como IDE ela sugeriu algo muito interessante e que passei adotar sempre que posso, o nova sintaxe do switch/case. A instrução switch case comum do Java segue algo muito similar a já implementada no C, um exemplo simples: package com.company; public class Main { public static void main(String[] args) { var nome = "Cebolinha"; switch(nome) { case "Lucas": System.out.println("Bem vindo programador Lucas"); break; case "Grace": System.out.println("Bem vinda programadora Grace Hopper"); break; default: System.out.println("Bem vindx pessoa programadora " + nome); } } } Esta é a estrutura comum que já conhecemos, como você pode ver temos os casos específicos que tratamos, o caso padrão e para que a avaliação do switch/case pare precisamos utilizar a clausula break, o que chega a me dar “gastura” em switch/cases muito grandes. ...

27 de setembro de 2021 · 4 min de leitura · Lucas Polo

Pytest: Pequeno manual para o dia a dia - Fixtures

Depois que comecei a programar em Python no dia a dia eu me deparei com uma das ferramentas mais legais de teste que conheci, o Pytest. Por padrão o Python já vem com uma ferramenta de testes chamada Unittest, que é muito boa e funcional, porém como ela foi criada junto com o Python algumas arestas dela ficaram soltas, principalmente por não utilizar toda a potência que a própria linguagem oferece. Aqui eu vou deixar algumas coisas muito interessantes que uso no meu dia a dia e como podem servir principalmente como um guia rápido do Pytest. ...

20 de setembro de 2021 · 3 min de leitura · Lucas Polo

Quem programa as linguagens de programação?

Acredito que todo programador já se perguntou ou irá se perguntar como as linguagens de programação são feitas, principalmente se você não teve nenhuma disciplina como compiladores na faculdade. Eu me fiz essa pergunta algumas vezes e aprendi muito com ela. Se você pesquisar na internet sobre como compiladores são feitos ou perguntar por ai um dos conteúdos que irá descobrir é o excelente, porém bem complexo para iniciantes, Compiladores: Princípios, técnicas e ferramentas de Alfred V. Aho Et al. ...

13 de setembro de 2021 · 4 min de leitura · Lucas Polo

Escrevendo um sistema operacional em Rust de Philipp Oppermann

Eu me lembro que em 2008 eu imaginei como seria criar um sistema operacional e na época eu busquei algo na internet para fazer uma introdução no assunto. Eu lembro que a primeira coisa que imaginei foi que pelo menos a “entrada” do sistema operacional precisaria ser escrita em Assembly. Procurando pela internet algo como “fazer um Hello World bootável”, ou como criar um programa que não precisa de sistema operacional para escrever algo na tela. Lembro-me que encontrei algo em C sobre um tal de endereço 0x800000 mas ficou por isso mesmo, na época o assunto estava muito além do que eu conseguia fazer facilmente e também não continuei aprendendo para entender como fazer algo. ...

6 de setembro de 2021 · 3 min de leitura · Lucas Polo

Fazendo queries SQL em arquivos CSV

Vira e mexe eu recebo alguns arquivos CSV que preciso fazer algum filtro ou alguma análise. Eu gosto muito de usar o Python para alguns processamentos, mas não é a coisa mais prática do mundo, ou abrir um script ou abrir um Jupyter Notebook para essa análise. Foi então que descobri que o DBeaver pode nos ajudar com este processo e é muito simples. Após abrirmos o DBeaver basta criarmos uma nova conexão e selecionarmos o diretório onde constará o(s) arquivo(s) CSV. ...

2 de setembro de 2021 · 1 min de leitura · Lucas Polo

Realizando commits parciais no Git

Durante o desenvolvimento é comum alterarmos o mesmo arquivo diversas vezes e se você gosta de manter um histórico consistente de suas alterações você pode esbarrar na situação onde um arquivo foi alterado em mais de um ponto e quer separar em commits distintos essas alterações. Pra exemplificar este aqui é o código que iremos trabalhar: from collections import namedtuple Cliente = namedtuple('Cliente', 'nome,idade'.split(',')) def inserir_cliente(cliente): print(f'Cliente {cliente.nome} inserido com sucesso') return 'ok' def test_inserir_cliente(): cliente = Cliente("Monicão", 3) resultado = inserir_cliente(cliente) assert resultado == 'ok' Agora o que queremos fazer é adicionar uma função que verifica se o cliente é valido (o nome deverá ter mais de três caracteres e a idade deve ser um número maior ou igual a zero). ...

30 de agosto de 2021 · 3 min de leitura · Lucas Polo