Author
jakob-schroeter
View
5.123
Download
7
Embed Size (px)
DESCRIPTION
A 90 min addon for Ruby On Rails Programming by Christian Feser, Michael Kram, Jakob Schröter and Marc Seeger. Contents: Testing Test-Driven Development Security Performance Caching Deployment
Ruby on RailsWeb Development that doesn‘t hurtDezember 2008
www.xing.com/profile/Christian_Feserwww.xing.com/profile/Michael_Kramwww.xing.com/profile/Jakob_Schroeterwww.Marc-Seeger.de
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Wissenskasten
2
Generatoren Views Businesslogik Helper
ERB-Templates Model Assoziationen
Console Validatoren Forms Routing
REST Migrations Partial
Layout Controller Webservices Abhängigkeiten
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
agenda
• has_many
• Validatoren
• Testing
• Security
• Performance
• Deployment
• Diskussion
3
has_manyWann wird es aufgerufen?
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Once upon a time…
5
http://api.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Magic!
6
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Wait a second…
7
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
What?
„attribute functions“
8
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
When?
require(“my_model.rb“)
9
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
When II?
10
My Code Testing it
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
require? It wasn‘t me!
11
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Rails::Initializer
12
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
…or the lazy way…
• require_association_class()
13
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
In general…
• This is what you can expect to be loaded:
14
•Models•Views•Controllers•Helpers•lib/
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
How? Meta-Programming!
15
look at input manipulate code
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger 16
TestingFast, Sexy and Svelte
Was ist TDD?
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
TDD - Test-Driven Development
19
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Überblick
• Unit-Test:Hiermit werden hauptsächlich Models getestet.
• Functional-Tests:Setzt den Fokus auf das Testen von Controllern und Views.
• Integration-Tests:Dient zum Testen der Gesamtfunktionalität der Rails-Applikation.
20
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Was macht Rails für uns?
• Struktur anlegen:
▫ Unit Tests (test/unit)
▫ Functional Tests (test/functional)
▫ Integration Tests (test/integration)
▫ Test Fixtures (test/fixtures)
• Umgebung handeln:
database.yml
21
Test - Verzeichnisse
Logisch Physikalisch
22
Fixtures
• Testdaten, die Rails vor den Tests in die Modelle lädt
23
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Unit Testing Class
• Subclass von ActiveSupport::TestCase class
▫ class PersonTest < ActiveSupport::TestCase
• Benötigt test_helper
▫ require File.dirname(__FILE__) + '/../test_helper'
• Test Methoden beginnen mit test_
▫ test_my_method
• Mit Assertion Methoden Überprüfung auf true
▫ assert_equal 3, Item.count
24
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Unit Test - Demo
25
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Autotest
ZenTest http://zentest.rubyforge.org/
26
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Functional-Test
Testen, ob…• eine bestimmte Zeichenkette angezeigt wird.• der Controller ein bestimmtes Template anzeigt.• der Controller richtig weiterleitet.• ob die Seite korrekt geladen worden ist.• ob die richtigen Parameter übergeben worden
sind.• das Routing zu dem Controller korrekt
funktioniert.• …
27
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Functional-Test Demo
28
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger 29
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Integration-/Acceptance Test
1. Seite »flights/new« aufrufen.2. Überprüfen, ob die Seite fehlerfrei aufgerufen
werden konnte (HTTP-Status = 200).3. Überprüfen, ob das Template »flights/new«
geladen wurde.4. Flight-Formulardaten an die Seite »/flights«
schicken mit der HTML-Methode POST.5. Der Weiterleitung folgen.6. Überprüfen, ob die Seite ohne Fehler aufgerufen
werden konnte (HTTP-Status = 200).7. Überprüfen, ob das Template »flights/show«
geladen wurde.
30
Integration-/Acceptance Test
1. Seite »flights/new« aufrufen.
2. Überprüfen, ob die Seite fehlerfrei aufgerufen werden konnte (HTTP-Status = 200).
3. Überprüfen, ob das Template »flights/new« geladen wurde.
4. Flight-Formulardaten an die Seite »/flights« schicken mit der HTML-Methode POST.
5. Der Weiterleitung folgen.
6. Überprüfen, ob die Seite ohne Fehler aufgerufen werden konnte (HTTP-Status = 200).
7. Überprüfen, ob das Template »flights/show« geladen wurde.
31
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
SeleniumHQ
• DEMO
• http://seleniumhq.org/projects/on-rails/
32
Security…on Rails
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger 34
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Sessio
n ID
Session hijacking
35
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
CookieStore
• Cookie
▫ = Session ID + SHA512(Session ID+ ServerSideSecret)
▫ no tampering
• Encryption of cookie possible
▫ user can‘t see what you put in the cookie
• Especially for forms:
▫ ActionController::RequestForgeryProtection
36
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Example
37
source: http://api.rubyonrails.com/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
SQL Injection
38
Source: http://xkcd.com/327/
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
SQL Injection
Model.find(id)Model.find_by_something(something)
39
automatically applies SQL Escaping(' , " , NULL, …)
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
XSS
40
<script type="text/javascript">alert("XSS");</script>
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
XSS
• html_escape()
• sanitize():
• Safe ERB plugin
▫ checks that the proper methods are used if a stringis „tainted“ (read from I/O)
41
PerformanceRails on Speed
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
The known…
43
http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-performance-tips/
• Optimize your code
• Built-in Features verwenden
• Nur Daten laden, die auch verwendet werdenOrder.find(:all, :include => [:person])
• Datenbank-Features nutzen
▫ Stored procedures…
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Caching is good
44
• File-Caching für Controller und Views
▫ Einstellung im Environment
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Caching im View
45
• Page-Caching▫ Im Controller:caches_page :index, :show
expire_page(orders_path)
• Action-Caching▫ Im Controller:caches_action :index, :show
expire_action(orders_url)
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Caching im View
46
• Fragment-Caching
<% cache(:action => "list") do %>
…
<% end %>
expire_fragment(:controller => 'orders',
:action => 'list')
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
More caching
47
http://rubyfurnace.com/gems/cached_model
• Im Model: cached_model
▫ Plugin für Rails
▫ überschreibt model.find-Methoden
▫ spart DB-Queries
• Session Store
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
memcached
48
http://www.danga.com/memcached/
• generic, high-performance, distributed memory object caching system for speeding up dynamic web applications
• skalierbar, da globaler Cache
▫ in Environment-Konfig:config.cache_store = :mem_cache_store
Rails scalesReally?
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Yep, it does!
50
http://limited-overload.de/assets/2006/11/3/Rails-Konferenz_2006.pdf
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Frontend tuning
51
• CSS- und JavaScript-Dateien zusammenfügen▫ javascript_include_tag▫ stylesheet_link_tag
javascript_include_tag "prototype",
"cart", "checkout", :cache => "shop“
<script type="text/javascript"
src="/javascripts/shop.js"></script>
• Gzip-Komprimierung aktivieren
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
File-Requests auf mehrere (virtuelle)
Server verteilen
52
• Environment-Einstellung für javascript_include_tag, stylesheet_link_tagund image_tag
config.action_controller.asset_host =
„http://files%d.yourhost.de“
<img src="http://files0.yourhost.de
/images/ruby.png„ />
<img src="http://files1.yourhost.de
/images/rails.png„ />
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Entwicklungs-kosten
Hardware-kosten
53
Deployment…get yourself some Rails!
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
In the beginning Part 1
1. cd /path/to/your/rails/app2. mongrel_rails cluster::start
#curl -I 127.0.0.1:8000
HTTP/1.1 200 OK Connection: close Date: Tue, 11 Dec2008 23:09:13 GMT Status: 200 OK Server: Mongrel 1.0.1 Content-Type: text/html Content-Length: 0
55
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
In the beginning Part 2
56
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Today:
57
# gem install passenger# passenger-install-apache2-module
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Passenger (= mod_rails = mod_passenger)
58
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Configuration
59
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
JRuby
60
Tomcat Glassfish
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Glassfish
First: gem install glassfish
Then:
cd /my/rails/app
glassfish
61
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Tomcat (or anything else…)
• gem install warbler
• cd /my/rails/app
• warble
62
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger 63
Yes, it‘s the actual logo…
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Diskussion
64
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Quellen
• Fischer, Jens-Christian: Professionelle Webentwicklung mit Ruby on Rails2 (2008): mitp
• http://errtheblog.com/posts/25-memcaching-rails• http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-
performance-tips/• http://api.rubyonrails.org/• Morsy, Hussein; Otto, Tanja: Ruby on Rails 2 – Das Entwickler-Handbuch
(2008): Galileo Press• Wartala, Ramon; Krutisch, Jan: Webanwendungen mit Ruby on Rails
(2007): Addision-Wesley Verlag• Sang Shin: javapassion.com/rubyonrails/• http://wiki.rubyonrails.com/rails/pages/HowtosTesting• Bruce, Tate; Curt Hibbs (2006): Durchstarten mit Ruby on Rails• http://zentest.rubyforge.org/• http://seleniumhq.org/projects/on-rails
65