cucumber-blanket 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +15 -8
- data/lib/cucumber/blanket.rb +8 -5
- data/lib/cucumber/blanket/coverage_data.rb +13 -12
- data/lib/cucumber/blanket/version.rb +1 -1
- data/spec/fixtures/simple.json +2 -2
- data/spec/lib/cucumber/blanket/coverage_data_spec.rb +27 -1
- data/spec/lib/cucumber/blanket_spec.rb +7 -0
- data/spec/spec_helper.rb +0 -7
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b714356da5e34fa7ad85c6e4aa0e84fe02375e7c
|
4
|
+
data.tar.gz: f0098ff584b7ef9efed4acb1fdf45bbef8aef8e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff7bfbf589cf87174b1954234836b6eaaa9f29f0460cd3bc70698457dc35baae3ba75b1d89cfbe06163bb4e5f7c60df8ef92600c930dacf71114e10646b27e57
|
7
|
+
data.tar.gz: 28722ff3dbd10ef8ed147e2da0d7ad6a61ae1631ff6915443d47eb1833208892e2ae5ea3f0833754241b5064ed7fef1309ea0afbed04104e9c5de411e1a3d563
|
data/README.md
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
# Cucumber::Blanket
|
2
2
|
|
3
|
-
|
4
|
-
the
|
5
|
-
|
6
|
-
Works to extract [Blanket.js](https://github.com/alex-seville/blanket) coverage data
|
7
|
-
from the browser from Cucumber.
|
3
|
+
Works to extract accumulated [Blanket.js](https://github.com/alex-seville/blanket) coverage data
|
4
|
+
from the browser from a Cucumber environment. Accumulated, in this context, means that coverage data
|
5
|
+
is accumulated from scenario to scenario, in an additive fashion.
|
8
6
|
|
9
7
|
## Installation
|
10
8
|
|
@@ -57,15 +55,24 @@ such Cucumber::Blanket OR's the lines. In other words, if line 10 of
|
|
57
55
|
File A was covered in Scenario X, but not in Scenario Y, line 10 is
|
58
56
|
considered covered when Cucumber has finished running.
|
59
57
|
|
60
|
-
Finally, to
|
58
|
+
Finally, to gain access to the accumulated coverage data, you can use the shorthand `Cucumber::Blanket.files`:
|
61
59
|
|
62
60
|
```ruby
|
63
61
|
after_exit do
|
64
|
-
|
62
|
+
covdata = # do something with it
|
63
|
+
File.open("tmp/coverage.json", "w") do |file|
|
64
|
+
file.write Cucumber::Blanket.files.to_json
|
65
|
+
# writes out JSON of this form of ruby hash:
|
66
|
+
# => {"http://127.0.0.1:32344/js/collections/assets.js"=>
|
67
|
+
# [3, 3, 3, nil, 3, nil, nil, nil, 0, 0, nil, 0, nil, nil, nil, nil, 0, 0]}
|
68
|
+
# {filename=>[lineCov,lineCov,lineCov]}
|
69
|
+
# At this stage you can fetch the files and create a nice HTML report, etc
|
70
|
+
end
|
65
71
|
end
|
66
72
|
```
|
67
73
|
|
68
|
-
I have both of these in my `features/support/hooks.rb` file.
|
74
|
+
I have both of these in my `features/support/hooks.rb` file. As far as doing something useful
|
75
|
+
with the coverage data, that's left up to the user, another gem, or maybe blanket.js itself from Node.js.
|
69
76
|
|
70
77
|
## Contributing
|
71
78
|
|
data/lib/cucumber/blanket.rb
CHANGED
@@ -10,6 +10,14 @@ module Cucumber
|
|
10
10
|
@@coverage_data
|
11
11
|
end
|
12
12
|
|
13
|
+
def reset!
|
14
|
+
@@coverage_data = CoverageData.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def files
|
18
|
+
self.coverage_data.files
|
19
|
+
end
|
20
|
+
|
13
21
|
# Grab code coverage from the frontend
|
14
22
|
# Currently this adds >1 second to every scenario, but it's worth it
|
15
23
|
def extract_from page
|
@@ -21,11 +29,6 @@ module Cucumber
|
|
21
29
|
@@coverage_data.accrue! page_data
|
22
30
|
return page_data
|
23
31
|
end
|
24
|
-
|
25
|
-
def generate_report
|
26
|
-
# but for now, so you know it's there...
|
27
|
-
puts "coverage data length: #{@@coverage_data.inspect}"
|
28
|
-
end
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
@@ -8,45 +8,46 @@ module Cucumber
|
|
8
8
|
attr_reader :data
|
9
9
|
|
10
10
|
def initialize
|
11
|
-
@data =
|
11
|
+
@data = {'files'=>{}}
|
12
12
|
end
|
13
13
|
|
14
14
|
def method_missing *args
|
15
|
-
@data
|
15
|
+
@data.send(*args)
|
16
|
+
end
|
17
|
+
|
18
|
+
def files
|
19
|
+
self.data['files']
|
16
20
|
end
|
17
21
|
|
18
22
|
def accrue! page_data
|
19
|
-
# go through every line of every file and OR it all together
|
20
|
-
# e.g. line 1 is 1 and 0, so it is 1
|
21
|
-
#binding.pry
|
22
23
|
if @data.nil?
|
23
24
|
@data = page_data
|
24
25
|
else
|
25
26
|
# for files in page_data ...
|
26
|
-
page_data[
|
27
|
+
page_data['files'].each do |filename, linedata|
|
27
28
|
# that exist in @data
|
28
|
-
if @data[
|
29
|
+
if @data['files'][filename]
|
29
30
|
# accrue coverage data, meaning:
|
30
31
|
# get a handle on existing linedata and iterate
|
31
|
-
@data[
|
32
|
-
new_cov_stat = page_data[
|
32
|
+
@data['files'][filename].each_with_index do |cov_stat, line_no|
|
33
|
+
new_cov_stat = page_data['files'][filename][line_no]
|
33
34
|
# first we need to deal with nils, as we cannot add them
|
34
35
|
# either side can be nil -- and we want to be strictly additive
|
35
36
|
next if new_cov_stat.nil? # this is not additive, next line
|
36
37
|
# So now we know the new data is definitely not nil
|
37
38
|
# but the existing data could be, so we'll handle that now
|
38
39
|
if cov_stat.nil?
|
39
|
-
@data[
|
40
|
+
@data['files'][filename][line_no] = new_cov_stat
|
40
41
|
# We replaced it with the new data, next line please
|
41
42
|
next
|
42
43
|
end
|
43
44
|
# if we ever get here, we're dealing strictly with integers
|
44
45
|
# as a result we just need to sum the two stats
|
45
|
-
@data[
|
46
|
+
@data['files'][filename][line_no] = cov_stat + new_cov_stat
|
46
47
|
end
|
47
48
|
else # if it does not exist
|
48
49
|
# add it to 'files' as is
|
49
|
-
@data[
|
50
|
+
@data['files'][filename] = linedata
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
data/spec/fixtures/simple.json
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Cucumber::Blanket::CoverageData do
|
4
|
+
before(:each) { Cucumber::Blanket.reset! }
|
4
5
|
let(:page) { FakePage.new }
|
5
6
|
let(:covdata) do
|
6
7
|
Cucumber::Blanket.extract_from(page)
|
@@ -10,7 +11,7 @@ describe Cucumber::Blanket::CoverageData do
|
|
10
11
|
describe "#accrue!" do
|
11
12
|
let(:new_page_data) do
|
12
13
|
page_data = Marshal.load(Marshal.dump(covdata.data))
|
13
|
-
page_data[
|
14
|
+
page_data['files'].first[1][0] = 3 # add coverage on that line
|
14
15
|
page_data
|
15
16
|
end
|
16
17
|
it "squishes coverage datasets together" do
|
@@ -20,5 +21,30 @@ describe Cucumber::Blanket::CoverageData do
|
|
20
21
|
covdata["files"].first[1][0].should eq 3
|
21
22
|
covdata["files"].first[1][1].should eq 2
|
22
23
|
end
|
24
|
+
|
25
|
+
context "filename exists but is not iterable" do
|
26
|
+
let(:new_page_data) do
|
27
|
+
Marshal.load(Marshal.dump(covdata.data))
|
28
|
+
end
|
29
|
+
before do
|
30
|
+
@data_copy = new_page_data
|
31
|
+
@filename = covdata['files'].first[0]
|
32
|
+
covdata['files'][@filename] = nil
|
33
|
+
end
|
34
|
+
it "will not try to iterate over nil" do
|
35
|
+
expect {covdata.accrue! @data_copy}.not_to raise_error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
describe "#files" do
|
42
|
+
it "shorthand for accessing the files hash" do
|
43
|
+
covdata.files.should eq covdata.data['files']
|
44
|
+
covdata.files.should be_a Hash
|
45
|
+
end
|
46
|
+
it "has a shortcut that produces the same data" do
|
47
|
+
Cucumber::Blanket.files.should eq covdata.files
|
48
|
+
end
|
23
49
|
end
|
24
50
|
end
|
@@ -1,6 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Cucumber::Blanket do
|
4
|
+
|
5
|
+
describe "#files" do
|
6
|
+
it "is a shortcut for coverage_data#files" do
|
7
|
+
subject.files.should eq subject.coverage_data.files
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
4
11
|
describe "#extract_from" do
|
5
12
|
let(:page) { FakePage.new }
|
6
13
|
context "Selenium-returned blanket.js coverage data structure characteristics" do
|
data/spec/spec_helper.rb
CHANGED