Está en la página 1de 30

Unit Testing

Juan P. Sandoval
Objetivos

● Repasar Code-Smells más conocidos.


● Crear Unit Test en Ruby
● Line Coverage
● Ruby rubocop linter
Code Smells (repaso)
Código Duplicado

● Misma estructura, expresión, o conjunto


de expresiones en más de un lugar.
● El código duplicado se puede eliminar
abstrayendo(o encapsulando) la parte del
codigo que no varia en clases o métodos.
Método Largo

● Si un método es demasiado largo uno


debería empezar a preguntarse si en
verdad es necesario.
● Normalmente, un método largo realiza
más de una tarea, entonces es posible
dividir el método en métodos más
pequeños que realizan una tarea a la vez.
Clases “Largas”
Las clases grandes pueden ser tener varios code
smells, entre ellos:

● Data Class, una clase que solo es usada para


almacenar constantes o datos, normalmente
viene con solo métodos accesores.
● Múltiples responsabilidades. Es posible que la
clase tenga más de una responsabilidad, si es
así, se puede dividir las clase en clases más
pequeñas repartiendo las responsabilidad y
reutilizando el código usando delegación.
Obsesión con las
Primitivas
A veces los programadores tienden a usar
datos primitivos relacionados entre sí de
forma directa en lugar de crear una clase.

Por ejemplo, declarar en varios lugares del


programa las variables ancho y alto, en
lugar de crear una clase rectángulo.
Lista de
Parámetros Larga
Cuando se tiene un método que recibe más de 3 o 4 argumentos se debe
analizar la necesidad de los mismos.

Muchas veces es porque el método intenta hacer dos operaciones al


mismo tiempo, por lo cual recibe unos argumentos para la primera
operación y otros para la segunda. En este caso, se recomienda crear
más métodos y distribuir las operaciones independientes.

Otra veces es porque en lugar de encapsular los datos en un objeto,


mandan los mismos datos uno por uno.
Existen muchos otros tipos más

Pueden encontrar más detalles en:

https://refactoring.guru/es/refactoring/smells
Unit Testing with Ruby
Crear un Directorio

mkdir ruby_proyect
cd ruby_proyect
Todos los comandos siguientes van dentro del directorio creado
Add Bundler

gem install bundler


bundler nos permite manejar dependencias, entre otras cosas, compilar y ejecutar un proyecto ruby.

Para especificar las dependencias de nuestro proyecto crearemos un archivo Gemfile, con el
siguiente texto dentro.

source 'https://rubygems.org'
Descargando/Instalando dependencias

bundler utiliza el Gemfile para descargar e instalar las dependencias del proyecto, para eso debemos
ejecutar el siguiente comando:

bundler install
Una vez instalado se generará un Gemfile.lock en el mismo directorio
Organizando el código en directorios

Crearemos dos directorios una para guardar los test y otro para el código fuente.

mkdir lib
mkdir test
lib/Wallet.rb
lib/WalletTest.rb

Inicialización

Estímulo

Verificación
Ejecutando las pruebas

ruby test/WalletTest.rb
Create a new file called Rakefile

Adding a Rakefile

ruby_proyect/Gemfile ruby_proyect/Rakefile

task default: %w[test]


source 'https://rubygems.org'
task :test do
gem ‘rake’
ruby 'test/WalletTest.rb'

end

agregar rake como dependencia


Ejecutando los test con rake

bundler install
rake test
Y ya tenemos nuestra primera unidad de prueba
automatizada
Line Coverage
Estoy probando todos los posibles casos?
https://github.com/simplecov-ruby/simplecov

ruby_proyect/Gemfile
source 'https://rubygems.org' require 'simplecov'
SimpleCov.start
gem ‘rake’
gem 'simplecov', require: false, group: :test

ejecutar estas instrucciones antes de


ejecutar los tests
agregar rake como dependencia
agregando las instrucciones directamente

deben ser las primeras dos líneas


Ejecutando los test con rake

rake test
Agregando más tests
Ejecutando los test de nuevo

rake test
Rubocop

Static Analysis
Agregando rubocop como dependencia
ruby_proyect/Gemfile ruby_proyect/Rakefile
source 'https://rubygems.org' require 'rubocop/rake_task'

gem ‘rake’ task default: %w[lint test]


gem 'simplecov', require: false, group: :test
task :test do
gem ‘rubocop’
ruby 'test/WalletTest.rb'

end
RuboCop::RakeTask.new(:lint) do |task|

task.patterns = ['lib/**/*.rb', 'test/**/*.rb']


agregar rubocop como dependencia task.fail_on_error = false

end
Consultas?

También podría gustarte