CukeUp! 2012: Michael Nacos on Just enough infrastructure for product development with cucumber
-
Upload
skills-matter-talks -
Category
Technology
-
view
655 -
download
1
Transcript of CukeUp! 2012: Michael Nacos on Just enough infrastructure for product development with cucumber
Product development with cucumber
with just enough infrastructure
Michael Nacos
what to expect from this talk
● integration tests=important for a tech startup● cucumber ecosystem is ideal for our stack
and our product requirements● cucumber + git + chef = heart● duck test/typing references don't expect:● the definitive cucumber style guide● plug-and-play solutions
Intro
cucumber as part of a whole
Intro
and too many others...
leemail for people
leemail
bookmarklet
why
● to let people share their email fearlessly● to shift unsubscribe power back to people● to encourage ethical behaviour from vendors● to help vendors safeguard their reputation
and customer data
leemail
it's about connecting, in a way that makes everyone happy
leemail for businesses
● do you collect email addresses?
● are you good?● do you want to
shout it? we help you establish and secure the relationship against leaks and bad PR
leemail
what do the cukes look like
cukes over time
cukes are part of the source tree
stories, branches
cukes over time
Monday Tuesday Wednesday Thursday Friday
cukes over time
Cukes or else!
netbooks
stack requirements
OR
if it can:● run cukes● connect to a vpn● git pull/push
... it's a dev machineeditors:
● 2 vi users● 1 emacs● 1 notepad++
email is different (esp. for leemail)
● mail servers need dns records, you cannot send to [email protected]
● there is an excellent 'mail' gem, but no smtp server gem afaik
● gems like 'mailtrap' exist but our smtp servers do more than just accept emails
● our daemons feed off rabbitmq queues, they shouldn't have to be changed for tests
● ideally, we'd have a lightweight smtp server which supports rules and delivers to rabbit
stack requirements
configuration is part of the product# setup postfix
%w{dynamicmaps.cf mailbox_commands main.cf master.cf sender_canonical password restricted_destinations sender_relayhosts}.each do |cfg|
template "/etc/postfix/#{cfg}" do
source "postfix/#{cfg}.erb"
owner "root"
group "root"
mode cfg == 'password' ? 0640 : 0644
notifies :restart, resources(:service => "postfix")
end
end
stack requirements
Servers
git pull # ok, you need to satisfy an erlang dependency manually once
Dev env
rails environments
development test production
stack requirements
good for interactive tests on your local machine, no email infrastructure, run mailtrap
for automated tests, minimum viable test environment for email testing available
for interactive tests on a server, chef dependency and configuration management a given
(taking advnatage of)
value
we want to know:● existing functionality has not been broken● new functionality is correct● before deploying to a server without:● expensive equipment● maintaining dev-specific environments● building internet replicas locally
what we test
RAILS_ENV='test'
if it speaks SMTP and it can follow some rules and deliver messages to a RabbitMQ queue...
it's a leemail mailserv
then the cukes can focus on things like: ● are email headers re-written properly?● do daemons deliver only to 'on' connections?etc.
what we test
extending our Worldin local_env.rb:
require ...World(EmailHelpers)
in email_helpers.rb:module EmailHelpers # called before each scenario def self.extended(base) endend# setting up email environment at cucumber startupEmailHelpers.setup_test_email_environment# tearing down email environment at cucumber exitat_exit do EmailHelpers.tear_down_test_email_environmentend
how we test
postfix_stub
how we test
SMTPruby net/smtp
ruby amqpleemails
emails ruby mail
(RabbitMQ)
(filesystem mbox)
in email_helpers.rb: def get_messages_from_mbox(mbox_path) # parsing mbox format raw_messages = IO.read(mbox_path).split(/\nFrom .+\n/) # returning a list of 'mail' messages raw_messages.map { |r| Mail.read_from_string(r) }end
leemail reply
examples
bandit
examples
i18n
makes your cukes less brittle you can write: Then I should see flash message "devise.sessions.signed_in"
tips
javascript
gem 'capybara-webkit' # requires apt-get install libqt4-dev in env.rb:
# use webkit driver in @javascript scenariaCapybara.javascript_driver = :webkit # setting the test server port to a known valueCapybara.server_port =AppConfig['test_server_port']
then add @javascript tag to specific cukes
tips
iframes (well, leemail iframes)
challenges
find iframe
js in iframe
nav in iframe
nav in parent
Thank You
@mnacos @leemailme
https://leemail.me/r/CUKEUP
Product development with cucumber