Download - Haciendo de las pruebas tus mejores aliadas
Johanna Mantilla Duque@senekis
Tus mejores aliadas
HACIENDO DE LAS PRUEBAS
¿Y QUÉ SE ENTIENDE POR PRUEBAS?
Mecanismo de detección de:
Errores Regresiones
¿Y QUÉ SE ENTIENDE POR PRUEBAS?
Partes del códigoque no se utiliza
Facilita la refactorización
¿POR QUÉ UTILIZAR PRUEBAS?
Arreglar problemas pequeños cada pocas horas toma menos tiempo que arreglar problemas
enormes justo antes de la fecha limite.
¿POR QUÉ UTILIZAR PRUEBAS?
Permiten descubrir errores cometidos sin darse cuenta tanto en el diseño como en la
construcción del software.
¿POR QUÉ UTILIZAR PRUEBAS?
Verificación: ¿Estamos construyendo el producto correctamente?
Validación: ¿Estamos construyendo el producto correcto?
¿CÓMO UTILIZAR LAS PRUEBAS?
1. Pruebas unitarias○ Unidades de software: Clases, Modelos,
Helpers
2. Pruebas de integración○ Módulos del sistema
3. Pruebas del sistema○ El sistema en su integridad, interacción del
usuario
AGRUPACIÓN DE PRUEBAS
TECNOLOGÍA
Rspec
Test unit
Phan
tonjs
Cucumber
Capybara-webkit
Selenium
Faker
Fabricator
Ej. Guardar la dirección a partir de georefenciación
class Report field :address, :type => String ... def localize(lat, long) self.address = GeoDataService.address(lat, long) self.save endend
PRUEBAS UNITARIAS
describe "Report Model" do let(:report) { Report.new }
class GeoDataService def address(lat, long) Faker::Address.street_address end end...end
PRUEBAS UNITARIAS
Pruebas unitarias
it "Should save the address field" do GeoDataService.should_receive(:address). with('4.630024', '-74.094973'). and_return('Carrera 42 # 22BIS-2') report.localize('4.630024', '-74.094973') report.address.should == "Carrera 42 # 22BIS-2" end
PRUEBAS UNITARIAS
Pruebas unitarias
Test Unit
class TestDeMates < Test::Unit::TestCcase def test_suma assert_equal 4, Mates.run("2+2") assert_equal 4, Mates.run("1+3") assert_equal 5, Mates.run("5+0") assert_equal 0, Mates.run("-5 + 5") endend
PRUEBAS UNITARIAS
PRUEBAS DE INTEGRACIÓN
describe ReportsController do let(:report) { Fabricate(:report) }
describe "GET index" do it "Should render the reports index" do get :index assigns[:reports].should == [report] response.should render_template('index') end end
PRUEBAS DEL SISTEMA
describe "the signup process", :type => :request do let(:user) { Fabricate(:user, :email => '[email protected]', :password => 'caplin')}
it "signs me in" do within("#session") do fill_in 'Login', :with => '[email protected]' fill_in 'Password', :with => 'password' end click_link 'Sign in' endend
¿QUÉ SE DEBE TENER EN CUENTA?
Eliminar comportamientos aleatorios
No depender de la anterior ni de la siguiente
¿QUÉ SE DEBE TENER EN CUENTA?
Funcionar sin conexión a red
¿QUÉ SE DEBE TENER EN CUENTA?
Deben ser independientes del momento en que se ejecutan
¿QUÉ SE DEBE TENER EN CUENTA?
No detallar cada uno de los pasos de tu metodo
no decir cómo, sino qué hace
¿QUÉ SE DEBE TENER EN CUENTA?¿QUÉ SE DEBE TENER EN CUENTA?
FILOSOFÍAS DE DESARROLLO
Test Driven Development (TDD)
Escribir las pruebas primero, luego implementación y refactorización.
"El propósito del desarrollo guiado por pruebas es lograr un código limpio que funcione. La idea es que los requisitos sean traducidos a pruebas, de este modo, cuando las pruebas pasen se garantizará el software cumple con los requisitos que se han establecido."
Wikipedia
Test Driven Development (TDD)
● Evita escribir código innecesario
● Aplicación de mejor calidad en menos tiempo
● Permite al programador centrarse en la tarea actual
VENTAJAS TDD
Versión mejorada de TDD que responde las inquietudes, tales como:● Cuando iniciar el proceso● Que probar y qué no probar
BEHAVIOR DRIVEN DEVELOPMENT (BDD)
BDD
Scenario: Create a post under a category Given a category exists And I am signed in as an admin When I go to create a new post And I select "Category 1" from "Categories" And I press "Create" And I go to view all posts Then I should see a post with the category "Category 1"
BDD
RcovSimplecovCoverage
Imagen: https://github.com/colszowka/simplecov
COVERAGE
Gracias
@senekis
@nounproject