motion-screenspecs
Test your RubyMotion app regressions using screenshot comparison (similar to Huxley and Wraith):
$ rake spec
AppScreenshots
  - should take screenshots
AppScreenshots.menu
  - should be <= 5.0% difference
AppScreenshots.timeline
  - should be <= 5.0% difference [FAILED - was 10.75%]
Bacon::Error: was 10.75%
    spec.rb:698:in `satisfy:': AppScreenshots.timeline - should be <= 5.0% difference
    spec.rb:438:in `execute_block'
    spec.rb:402:in `run_postponed_block:'
    spec.rb:397:in `resume'
3 specifications (3 requirements), 1 failures, 0 errors
(calculated diffs are truer than visual representation)
Installation
Add this line to your application's Gemfile:
gem 'motion-screenspecs'
And then execute:
$ bundle
Or install it yourself as:
$ gem install motion-screenspecs
Usage
motion-screenspecs works in unison with motion-screenshots. Here are the steps you need to get everything working:
- 
Create a subclass of
Motion::Screenshots::Base(see the motion-screenshots README). - 
Create the following directory structure:
spec/ screenshots/ [YourScreenshotSubclass] expectations/ [title of your screenshot].png [title of your other screenshot].png [etc].pngThe images in
expectationsare known values for your app. You can take these screenshots manually or using motion-screenshots'rake screenshots.Failing image diffs will be saved in
spec/screenshots/[YourScreenshotSubclass]/failures. All results from the latest test are saved tospec/screenshots/[YourScreenshotSubclass]/results. - 
Add a call to
tests_screenshotsin your specs:describe "Screenshots" do tests_screenshots AppScreenshots end
 
The sample app is a complete example with a failing test.
Hats off to Jeff Kreeftmeijer for the image diffing help!
Configuration
There's a couple of configuration options you can use:
Motion::Project::App.setup do |app|
  # Set your tolerance % for image differences
  Motion::Screenspecs.set_tolerance(5.0, app)
  # Set how long the tests will wait for your screenshots to finish
  Motion::Screenspecs.set_screenshot_timeout(120, app)
  # Set how long the tests will wait for a given image to finish diffing
  Motion::Screenspecs.set_diff_timeout(20, app)
  # Set whether or not your failed diffs will open in Finder upon finishing tests
  Motion::Screenspecs.open_failures_at_exit = true
endrake spec
Contributing
- Fork it
 - Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request
 
