green_onion 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -0
- data/README.md +19 -13
- data/green_onion.gemspec +1 -0
- data/lib/green_onion.rb +8 -2
- data/lib/green_onion/compare.rb +1 -1
- data/lib/green_onion/configuration.rb +18 -2
- data/lib/green_onion/screenshot.rb +6 -4
- data/lib/green_onion/version.rb +1 -1
- data/spec/unit/green_onion_spec.rb +53 -14
- data/spec/unit/screenshot_spec.rb +6 -4
- metadata +15 -4
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -9,17 +9,19 @@ GreenOnion is a testing library for the UI only. It alerts you when the appearan
|
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
12
|
+
You'll need to get Qt built in your testing environment. [Follow these steps](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit) to get it up and running.
|
13
|
+
|
12
14
|
Add this line to your application's Gemfile:
|
13
15
|
|
14
|
-
|
16
|
+
gem 'green_onion'
|
15
17
|
|
16
18
|
And then execute:
|
17
19
|
|
18
|
-
|
20
|
+
bundle
|
19
21
|
|
20
22
|
Or install it yourself as:
|
21
23
|
|
22
|
-
|
24
|
+
gem install green_onion
|
23
25
|
|
24
26
|
## Usage
|
25
27
|
|
@@ -27,19 +29,21 @@ Or install it yourself as:
|
|
27
29
|
|
28
30
|
For RSpec, `require 'green_onion'` in your spec_helper.rb file. Place this block in the file also:
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
GreenOnion.configure do |c|
|
33
|
+
c.skins_dir = 'your/path/to/skins'
|
34
|
+
c.threshold = 20
|
35
|
+
c.dimensions = { :width => 1440, :height => 768 }
|
36
|
+
end
|
34
37
|
|
35
|
-
* `skins_dir` is the directory that GreenOnion will store all skins. The namespace for skins is {URI name}.png (original), {URI name}_fresh.png (testing), and {URI name}_diff.png
|
38
|
+
* `skins_dir` is the directory that GreenOnion will store all skins. The namespace for skins is {URI name}.png (original), {URI name}_fresh.png (testing), and {URI name}_diff.png. The default directory will be './spec/skins'
|
36
39
|
* `threshold` is the percentage of acceptable change that the screenshots can take. This number can always be overwritten for an instance.
|
40
|
+
* `dimensions` is a hash with the height and width of the browser window. The default dimensions are 1024x768.
|
37
41
|
|
38
42
|
Then use one of the three methods below in a test...
|
39
43
|
|
40
44
|
### Percentage of change
|
41
45
|
|
42
|
-
|
46
|
+
GreenOnion.skin_percentage(url, threshold {optional})
|
43
47
|
The primary feature of GreenOnion is seeing how much (if at all) a view has changed from one instance to the next, and being alerted when a view has surpassed into an unacceptable threshold.
|
44
48
|
|
45
49
|
* `url` is the screen you want tested. Must include http://, example - 'http://yourSite.com'
|
@@ -47,14 +51,15 @@ The primary feature of GreenOnion is seeing how much (if at all) a view has chan
|
|
47
51
|
|
48
52
|
### Viewing screenshot diffs
|
49
53
|
|
50
|
-
|
54
|
+
GreenOnion.skin_visual(url)
|
51
55
|
Once you are aware of a issue in the UI, you can also rip open your spec/skins directory and manually see what the differences are from one screenshot to the next.
|
52
56
|
|
53
57
|
* `url` is the screen you want tested. Must include http://, example - 'http://yourSite.com'
|
54
58
|
|
55
59
|
### Both viewing screenshot diffs and percentage of change
|
56
60
|
|
57
|
-
|
61
|
+
GreenOnion.skin_visual_and_percentage(url, threshold {optional})
|
62
|
+
This is just a combination of the two methods above.
|
58
63
|
|
59
64
|
## Contributing
|
60
65
|
|
@@ -62,14 +67,15 @@ Once you are aware of a issue in the UI, you can also rip open your spec/skins d
|
|
62
67
|
|
63
68
|
The best way to run the specs is with...
|
64
69
|
|
65
|
-
|
70
|
+
bundle exec rake spec
|
66
71
|
|
67
72
|
...this way a Sinatra WEBrick server will run concurrently with the test suite, and exit on completion. You can see the Sinatra app in spec/sample_app.
|
68
73
|
|
69
74
|
## Roadmap
|
70
75
|
|
71
76
|
* Screenshots can either be viewed as a visual diff, or overlayed newest over oldest and viewed as an onion-skin with sliding transparency.
|
72
|
-
* Allow for
|
77
|
+
* Allow for flexibility in picking browsers
|
78
|
+
* Run through all paths in a Rails app
|
73
79
|
* More robust tests, especially around the visual diffs themselves
|
74
80
|
* More documentation
|
75
81
|
* More configuration/customizable settings
|
data/green_onion.gemspec
CHANGED
data/lib/green_onion.rb
CHANGED
@@ -21,7 +21,8 @@ module GreenOnion
|
|
21
21
|
# Bring the Screenshot and Compare classes together to create a skin
|
22
22
|
def skin(url)
|
23
23
|
@screenshot = Screenshot.new(
|
24
|
-
:dir => @configuration.skins_dir
|
24
|
+
:dir => @configuration.skins_dir,
|
25
|
+
:dimensions => @configuration.dimensions
|
25
26
|
)
|
26
27
|
@compare = GreenOnion::Compare.new
|
27
28
|
|
@@ -31,12 +32,13 @@ module GreenOnion
|
|
31
32
|
# Finds the percentage of change between skins
|
32
33
|
# Threshold can be set in configuration, or as an argument itself, and can be specific to an instance
|
33
34
|
def skin_percentage(url, threshold=@configuration.threshold)
|
34
|
-
threshold ||= 100
|
35
35
|
skin(url)
|
36
36
|
if(@screenshot.paths_hash.length > 1)
|
37
37
|
puts "\n" + url.color(:cyan)
|
38
38
|
@compare.percentage_diff(@screenshot.paths_hash[:original], @screenshot.paths_hash[:fresh])
|
39
39
|
threshold_alert(@compare.percentage_changed, threshold)
|
40
|
+
else
|
41
|
+
puts "\n#{url}".color(:cyan) + " has been saved to #{@screenshot.paths_hash[:original]}".color(:yellow)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
@@ -46,6 +48,8 @@ module GreenOnion
|
|
46
48
|
if(@screenshot.paths_hash.length > 1)
|
47
49
|
puts "\n" + url.color(:cyan)
|
48
50
|
@compare.visual_diff(@screenshot.paths_hash[:original], @screenshot.paths_hash[:fresh])
|
51
|
+
else
|
52
|
+
puts "\n#{url}".color(:cyan) + " has been saved to #{@screenshot.paths_hash[:original]}".color(:yellow)
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
@@ -57,6 +61,8 @@ module GreenOnion
|
|
57
61
|
@compare.percentage_diff(@screenshot.paths_hash[:original], @screenshot.paths_hash[:fresh])
|
58
62
|
@compare.visual_diff(@screenshot.paths_hash[:original], @screenshot.paths_hash[:fresh])
|
59
63
|
threshold_alert(@compare.percentage_changed, threshold)
|
64
|
+
else
|
65
|
+
puts "\n#{url}".color(:cyan) + " has been saved to #{@screenshot.paths_hash[:original]}".color(:yellow)
|
60
66
|
end
|
61
67
|
end
|
62
68
|
|
data/lib/green_onion/compare.rb
CHANGED
@@ -51,7 +51,7 @@ module GreenOnion
|
|
51
51
|
begin
|
52
52
|
@images.last.rect(x.min, y.min, x.max, y.max, ChunkyPNG::Color.rgb(0,255,0))
|
53
53
|
rescue NoMethodError
|
54
|
-
puts "
|
54
|
+
puts "Both skins are the same.".color(:yellow)
|
55
55
|
end
|
56
56
|
|
57
57
|
@images.last.save(@diffed_image)
|
@@ -1,7 +1,23 @@
|
|
1
1
|
module GreenOnion
|
2
2
|
class Configuration
|
3
|
-
|
4
|
-
|
3
|
+
|
4
|
+
attr_writer :threshold, :skins_dir
|
5
|
+
|
6
|
+
def dimensions=(options)
|
7
|
+
@dimensions = { :width => options[:width], :height => options[:height] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def dimensions
|
11
|
+
@dimensions ||= { :height => 768, :width => 1024 }
|
12
|
+
end
|
13
|
+
|
14
|
+
def threshold
|
15
|
+
@threshold ||= 100
|
16
|
+
end
|
17
|
+
|
18
|
+
def skins_dir
|
19
|
+
@skins_dir ||= './spec/skins'
|
20
|
+
end
|
5
21
|
|
6
22
|
end
|
7
23
|
end
|
@@ -1,22 +1,25 @@
|
|
1
1
|
require 'capybara/dsl'
|
2
|
+
require 'capybara-webkit'
|
2
3
|
require "fileutils"
|
4
|
+
require "debugger"
|
3
5
|
|
4
6
|
module GreenOnion
|
5
7
|
class Screenshot
|
6
8
|
include Capybara::DSL
|
7
9
|
|
8
|
-
attr_accessor :dir
|
10
|
+
attr_accessor :dir, :dimensions
|
9
11
|
attr_reader :paths_hash
|
10
12
|
|
11
13
|
def initialize(params = {})
|
12
|
-
Capybara.default_driver = :
|
14
|
+
Capybara.default_driver = :webkit
|
15
|
+
@dimensions = params[:dimensions]
|
13
16
|
@dir = params[:dir]
|
14
17
|
@paths_hash = {}
|
15
18
|
end
|
16
19
|
|
17
20
|
def snap_screenshot(url, path)
|
18
21
|
visit url
|
19
|
-
Capybara.page.driver.
|
22
|
+
Capybara.page.driver.render(path, @dimensions)
|
20
23
|
end
|
21
24
|
|
22
25
|
def test_screenshot(url)
|
@@ -32,7 +35,6 @@ module GreenOnion
|
|
32
35
|
else
|
33
36
|
@shot_path = @paths_hash[:original]
|
34
37
|
end
|
35
|
-
return @shot_path
|
36
38
|
end
|
37
39
|
|
38
40
|
def get_path(url)
|
data/lib/green_onion/version.rb
CHANGED
@@ -2,17 +2,18 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe GreenOnion do
|
4
4
|
|
5
|
+
before(:all) do
|
6
|
+
@tmp_path = './spec/tmp'
|
7
|
+
@url = 'http://localhost:8070'
|
8
|
+
@url_w_uri = @url + '/fake_uri'
|
9
|
+
end
|
10
|
+
|
5
11
|
describe "Skins" do
|
6
|
-
|
7
12
|
before(:each) do
|
8
|
-
@tmp_path = './spec/tmp'
|
9
|
-
@url = 'http://localhost:8070'
|
10
|
-
@url_w_uri = @url + '/fake_uri'
|
11
13
|
FileUtils.mkdir(@tmp_path)
|
12
14
|
|
13
15
|
GreenOnion.configure do |c|
|
14
16
|
c.skins_dir = @tmp_path
|
15
|
-
c.threshold = 1
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -20,6 +21,11 @@ describe GreenOnion do
|
|
20
21
|
FileUtils.rm_r(@tmp_path, :force => true)
|
21
22
|
end
|
22
23
|
|
24
|
+
it "should default to 1024x768 browser dimensions" do
|
25
|
+
( (GreenOnion.configuration.dimensions[:height] == 768) &&
|
26
|
+
(GreenOnion.configuration.dimensions[:width] == 1024) ).should be_true
|
27
|
+
end
|
28
|
+
|
23
29
|
it "should set/get custom directory" do
|
24
30
|
GreenOnion.configuration.skins_dir.should eq(@tmp_path)
|
25
31
|
end
|
@@ -46,15 +52,8 @@ describe GreenOnion do
|
|
46
52
|
GreenOnion.compare.percentage_changed.should be == 0
|
47
53
|
end
|
48
54
|
|
49
|
-
it "should alert when diff percentage threshold is surpassed" do
|
50
|
-
$stdout.should_receive(:puts).exactly(4).times
|
51
|
-
2.times do
|
52
|
-
GreenOnion.skin_percentage(@url)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
55
|
it "should print just URL and changed/total when diff percentage threshold has not been surpassed" do
|
57
|
-
$stdout.should_receive(:puts).exactly(
|
56
|
+
$stdout.should_receive(:puts).exactly(3).times
|
58
57
|
2.times do
|
59
58
|
GreenOnion.skin_percentage(@url, 6)
|
60
59
|
end
|
@@ -67,7 +66,6 @@ describe GreenOnion do
|
|
67
66
|
GreenOnion.compare.diffed_image.should eq("#{@tmp_path}/root_diff.png")
|
68
67
|
end
|
69
68
|
|
70
|
-
|
71
69
|
it "should create visual diff between skins (even when there is no change)" do
|
72
70
|
2.times do
|
73
71
|
GreenOnion.skin_visual(@url_w_uri)
|
@@ -82,6 +80,47 @@ describe GreenOnion do
|
|
82
80
|
( (GreenOnion.compare.diffed_image.should eq("#{@tmp_path}/root_diff.png")) &&
|
83
81
|
(GreenOnion.compare.percentage_changed.should be > 0) ).should be_true
|
84
82
|
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "Skins with custom dimensions" do
|
86
|
+
before(:each) do
|
87
|
+
FileUtils.mkdir(@tmp_path)
|
88
|
+
|
89
|
+
GreenOnion.configure do |c|
|
90
|
+
c.skins_dir = @tmp_path
|
91
|
+
c.dimensions = { :width => 1440, :height => 900 }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
after(:each) do
|
96
|
+
FileUtils.rm_r(@tmp_path, :force => true)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should allow custom browser dimensions" do
|
100
|
+
( (GreenOnion.configuration.dimensions[:height] == 900) &&
|
101
|
+
(GreenOnion.configuration.dimensions[:width] == 1440) ).should be_true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "Skins with custom threshold" do
|
106
|
+
before(:each) do
|
107
|
+
FileUtils.mkdir(@tmp_path)
|
85
108
|
|
109
|
+
GreenOnion.configure do |c|
|
110
|
+
c.skins_dir = @tmp_path
|
111
|
+
c.threshold = 1
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
after(:each) do
|
116
|
+
FileUtils.rm_r(@tmp_path, :force => true)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should alert when diff percentage threshold is surpassed" do
|
120
|
+
$stdout.should_receive(:puts).exactly(5).times
|
121
|
+
2.times do
|
122
|
+
GreenOnion.skin_percentage(@url)
|
123
|
+
end
|
124
|
+
end
|
86
125
|
end
|
87
126
|
end
|
@@ -5,16 +5,18 @@ describe GreenOnion::Screenshot do
|
|
5
5
|
before(:all) do
|
6
6
|
@url = 'http://localhost:8070'
|
7
7
|
@url_w_uri = @url + '/fake_uri'
|
8
|
+
@tmp_path = './spec/tmp'
|
9
|
+
@dimensions = { :width => 1024, :height => 768 }
|
8
10
|
end
|
9
11
|
|
10
12
|
describe 'Snap single screenshot' do
|
11
13
|
|
12
14
|
before(:each) do
|
13
|
-
@tmp_path = './spec/tmp'
|
14
15
|
FileUtils.mkdir(@tmp_path)
|
15
16
|
|
16
17
|
@screenshot = GreenOnion::Screenshot.new(
|
17
|
-
:dir => @tmp_path
|
18
|
+
:dir => @tmp_path,
|
19
|
+
:dimensions => @dimensions
|
18
20
|
)
|
19
21
|
@file = "#{@tmp_path}/fake_uri.png"
|
20
22
|
end
|
@@ -49,11 +51,11 @@ describe GreenOnion::Screenshot do
|
|
49
51
|
describe 'Snap two screenshots' do
|
50
52
|
|
51
53
|
before(:each) do
|
52
|
-
@tmp_path = './spec/tmp'
|
53
54
|
FileUtils.mkdir(@tmp_path)
|
54
55
|
|
55
56
|
@screenshot = GreenOnion::Screenshot.new(
|
56
|
-
:dir => @tmp_path
|
57
|
+
:dir => @tmp_path,
|
58
|
+
:dimensions => @dimensions
|
57
59
|
)
|
58
60
|
@file1 = "#{@tmp_path}/fake_uri.png"
|
59
61
|
@file2 = "#{@tmp_path}/fake_uri_fresh.png"
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: green_onion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ted O'Meara
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-30 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -90,7 +90,7 @@ dependencies:
|
|
90
90
|
type: :runtime
|
91
91
|
version_requirements: *id007
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
|
-
name:
|
93
|
+
name: capybara-webkit
|
94
94
|
prerelease: false
|
95
95
|
requirement: &id008 !ruby/object:Gem::Requirement
|
96
96
|
none: false
|
@@ -101,7 +101,7 @@ dependencies:
|
|
101
101
|
type: :runtime
|
102
102
|
version_requirements: *id008
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
104
|
+
name: oily_png
|
105
105
|
prerelease: false
|
106
106
|
requirement: &id009 !ruby/object:Gem::Requirement
|
107
107
|
none: false
|
@@ -111,6 +111,17 @@ dependencies:
|
|
111
111
|
version: "0"
|
112
112
|
type: :runtime
|
113
113
|
version_requirements: *id009
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: rainbow
|
116
|
+
prerelease: false
|
117
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: "0"
|
123
|
+
type: :runtime
|
124
|
+
version_requirements: *id010
|
114
125
|
description: UI testing/screenshot diffing tool
|
115
126
|
email:
|
116
127
|
- ted@intridea.com
|