14. “ practica de reunir el código
que estamos desarrollando
frecuentemente, para
verificarlo y evitar errores
”
David Calavera
15. “ Continuous Integration is a software development
practice where members of a team integrate their work
frequently, usually each person integrates at least daily
- leading to multiple integrations per day. Each
integration is verified by an automated build (including
test) to detect integration errors as quickly as possible.
Many teams find that this approach leads to significantly
”
reduced integration problems and allows a team to
develop cohesive software more rapidly.
Martin Fowler
25. reducir su duración
• usar una máquina dedicada para CI
• mejorar el rendimiento de nuestros tests
• separar los tests por categorías
• ejecutar el build por etapas
26. ejecutar los test en
paralelo
• sudo gem install deep_test
DeepTest::TestTask.new 'deep_test:functionals' do |t|
t.pattern = quot;test/functional/**/*_test.rbquot;
t.number_of_workers = 2
end
27. ejecutar los test en
paralelo
• también para RSpec
Spec::Rake::SpecTask.new 'deep_spec:functionals' do |t|
t.spec_files = FileList['spec/functional/**/*_spec.rb']
t.deep_test :number_of_workers => 2
end
28. ejecutar los test en
paralelo
• ¡con una base de datos para cada worker!
DeepTest::TestTask.new 'deep_test:functionals' do |t|
t.pattern = quot;test/functional/**/*_test.rbquot;
t.worker_listener = 'DeepTest::Database::MysqlSetupListener'
end
29. usar un servidor de CI
• preguntar por cambios en el repositorio
• realizar acciones en horarios determinados
• soportar diferentes herramientas
• mostrar builds históricos
• soportar diferentes tipos de informes
• soportar diferentes tipos de notificaciones
31. CruiseControl.rb
• muy POCO “user friendly”
• plugins perdidos por internet
• pero muy fáciles de desarrollar
• http://cruisecontrolrb.thoughtworks.com
35. Run Code Run
• de momento solo proyectos open source
• de momento solo se integra con github
• soporte de CI para la última Rails Rumble
• http://runcoderun.com
47. lo que hay que hacer
• automatizar los cambios de la base de datos
• crear la base de datos
• modificar la base de datos
• testing e inspección
48. Migraciones
• muchas mejoras desde Rails 2.1
create db/migrate/20081112232842_modify_user.rb
class ModifyUser < ActiveRecord::Migration
def self.up
change_table :user do |user|
t.rename :surname, :last_name
t.remove :age
...
end
end
end
50. test unitarios
• enfocados en un objeto
• comprobar installes totalmente unitario
que
•
sudo gem unit_record
ActiveRecord::Base.disconnect!
• usar mocks en lugar de fixtures
51. test unitarios
• ¡¡hay que hacerlos para cualquier clase!!
•sudo gem install unit_controller
def setup
@controller = UserController.new
@controller.do_not_render_vew
end
52. test funcionales
• usa factories en lugar de fixtures
•
sudo gem install thoughtbot-factory_girl
Factory.define :user do |u|
u.first_name 'Joe'
u.last_name 'Doe'
u.email {|att| quot;#{att.first_name}@example.comquot;.downcase }
end
53. test funcionales
• ¡¡hay que hacerlos modelotodas lasde datos
para clases!!
• interacción entre el y la base
• interacción entre el modelo y el controlador
• interacción entre el controlador y la vista
55. reducir la complejidad
• Flog
def flog(output, *directories)
`find #{directories.join(quot; quot;)} -name *.rb|xargs flog
> #{RAILS_ROOT}/tmp/flog/#{output}.txt`
end
desc quot;Flog models, controller, helpers and libquot;
task :flog do
flog quot;allquot;, *%w[app/models app/controllers app/helpers lib]
end
56. eliminar código
duplicado o sin usar
• Dust
def unused_lvar
a = 1
1 + 2
end
d = Dust::LocalVariableDuster.new(Object, :unused_lvar)
d.dust!
d.warnings
57. eliminar código
duplicado o sin usar
• PMD-CPD
def cpd(*directories)
`java net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 -files
#{directories.map(quot; --files quot;)} --language ruby`
end
task :cpd do
cpd *%w[app/models app/controllers app/helpers lib]
end