CukeUp! 2012: Michael Nacos on Just enough infrastructure for product development with cucumber

Post on 19-May-2015

655 views 1 download

Tags:

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 test@127.0.0.1

● 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