learn-test 2.5.6 → 2.6.0
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 +5 -5
- data/LICENSE.txt +1 -1
- data/README.md +2 -3
- data/learn-test.gemspec +1 -1
- data/lib/learn_test.rb +2 -1
- data/lib/learn_test/js_strategy.rb +7 -3
- data/lib/learn_test/runner.rb +1 -1
- data/lib/learn_test/strategies/pytest.rb +80 -0
- data/lib/learn_test/strategies/{python_unittest → pytest}/requirements_checker.rb +21 -19
- data/lib/learn_test/version.rb +1 -1
- data/spec/lib/learn_test/strategies/mocha_spec.rb +20 -17
- metadata +6 -7
- data/lib/learn_test/strategies/python_unittest.rb +0 -72
- data/lib/learn_test/strategies/python_unittest/nose_installer.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cc7eb81e50945d683e8bb07870e1160c8ec269927106fd8f50d921cc71034002
|
4
|
+
data.tar.gz: ca2bb24e7603d0d6649ebb472568c2dcae6050f0f9ce9894c871ba53ca71ce46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e141cae46336820ddd5ce0114b84d52c4541af809bc89a9be402935ab1adef08db72be596b407d4bbf7c6b1fc92e15e31ad8e357af2dd98c97e3bdc6f7f635c0
|
7
|
+
data.tar.gz: 30400f93167d9db8e2138830618a29635c6edb9ed600a0e1ddf9212f52c30e3da3d09cbccf02893b208f1b2ae3f0fdbcffcfc5402499a52d7d651042162ebb90
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# learn-test
|
2
2
|
|
3
|
-
Runs RSpec, Jasmine, and Python
|
3
|
+
Runs RSpec, Jasmine, and Python Pytest test suites and uploads the results to Learn.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -22,7 +22,7 @@ And then execute:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
From within a directory with an RSpec, Jasmine, Karma, Mocha, or Python
|
25
|
+
From within a directory with an RSpec, Jasmine, Karma, Mocha, or Python Pytest test suite, run:
|
26
26
|
|
27
27
|
```
|
28
28
|
$ learn-test
|
@@ -35,4 +35,3 @@ $ learn-test
|
|
35
35
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
36
36
|
4. Push to the branch (`git push origin my-new-feature`)
|
37
37
|
5. Create a new Pull Request
|
38
|
-
|
data/learn-test.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = LearnTest::VERSION
|
9
9
|
spec.authors = ["Flatiron School"]
|
10
10
|
spec.email = ["learn@flatironschool.com"]
|
11
|
-
spec.summary = %q{Runs RSpec, Jasmine, Karma, Mocha, and Python
|
11
|
+
spec.summary = %q{Runs RSpec, Jasmine, Karma, Mocha, and Python Pytest Test builds and pushes JSON output to Learn.}
|
12
12
|
spec.homepage = "https://github.com/learn-co/learn-test"
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
data/lib/learn_test.rb
CHANGED
@@ -17,7 +17,6 @@ require_relative 'learn_test/dependency'
|
|
17
17
|
require_relative 'learn_test/strategy'
|
18
18
|
require_relative 'learn_test/js_strategy'
|
19
19
|
require_relative 'learn_test/strategies/jasmine'
|
20
|
-
require_relative 'learn_test/strategies/python_unittest'
|
21
20
|
require_relative 'learn_test/strategies/rspec'
|
22
21
|
require_relative 'learn_test/strategies/karma'
|
23
22
|
require_relative 'learn_test/strategies/protractor'
|
@@ -25,6 +24,7 @@ require_relative 'learn_test/strategies/java_junit'
|
|
25
24
|
require_relative 'learn_test/strategies/csharp_nunit'
|
26
25
|
require_relative 'learn_test/strategies/mocha'
|
27
26
|
require_relative 'learn_test/strategies/green_onion'
|
27
|
+
require_relative 'learn_test/strategies/pytest'
|
28
28
|
|
29
29
|
module LearnTest
|
30
30
|
module Dependencies
|
@@ -39,5 +39,6 @@ module LearnTest
|
|
39
39
|
autoload :SeleniumServer, 'learn_test/dependencies/selenium_server'
|
40
40
|
autoload :Firefox, 'learn_test/dependencies/firefox'
|
41
41
|
autoload :GreenOnion, 'learn_test/dependencies/green_onion'
|
42
|
+
autoload :Pytest, 'learn_test/dependencies/pytest'
|
42
43
|
end
|
43
44
|
end
|
@@ -8,11 +8,15 @@ module LearnTest
|
|
8
8
|
[:dependencies, :devDependencies].any? { |key| js_package[key] && js_package[key][dep] }
|
9
9
|
end
|
10
10
|
|
11
|
+
def modules_missing?(module_names)
|
12
|
+
module_names.any? { |name| !File.exist?("node_modules/#{name}") }
|
13
|
+
end
|
14
|
+
|
11
15
|
def missing_dependencies?
|
12
16
|
return true if !File.exist?("node_modules")
|
13
|
-
|
14
|
-
|
15
|
-
(
|
17
|
+
[:dependencies, :devDependencies, :peerDependencies].any? do |dep_group|
|
18
|
+
modules = js_package[dep_group] || {}
|
19
|
+
modules_missing?(modules.keys)
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
data/lib/learn_test/runner.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'crack'
|
2
|
+
require_relative 'pytest/requirements_checker'
|
3
|
+
|
4
|
+
module LearnTest
|
5
|
+
module Strategies
|
6
|
+
class Pytest < LearnTest::Strategy
|
7
|
+
|
8
|
+
def service_endpoint
|
9
|
+
'/e/flatiron_pytest'
|
10
|
+
end
|
11
|
+
|
12
|
+
def detect
|
13
|
+
test_files.count > 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def check_dependencies
|
17
|
+
LearnTest::Pytest::RequirementsChecker.check_installation
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
system("python -m pytest #{options[:argv].join(' ')} --junitxml='./.results.xml'")
|
22
|
+
end
|
23
|
+
|
24
|
+
def output
|
25
|
+
@output ||= Crack::XML.parse(File.read('.results.xml'))["testsuite"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_files
|
29
|
+
# pytest will run all files of the form test_*.py or *_test.py
|
30
|
+
@test_files ||= Dir.glob("**/test_*.py") + Dir.glob("**/*_test.py")
|
31
|
+
end
|
32
|
+
|
33
|
+
def results
|
34
|
+
failed_count = output["failures"].to_i + output["errors"].to_i
|
35
|
+
skipped_count = output["skips"].to_i
|
36
|
+
passed_count = output["tests"].to_i - failed_count - skipped_count
|
37
|
+
{
|
38
|
+
username: username,
|
39
|
+
github_user_id: user_id,
|
40
|
+
learn_oauth_token: learn_oauth_token,
|
41
|
+
repo_name: runner.repo,
|
42
|
+
build: {
|
43
|
+
test_suite: [{
|
44
|
+
framework: 'pytest',
|
45
|
+
formatted_output: output.to_json,
|
46
|
+
duration: output["time"]
|
47
|
+
}]
|
48
|
+
},
|
49
|
+
examples: output["tests"].to_i,
|
50
|
+
passing_count: passed_count,
|
51
|
+
pending_count: skipped_count,
|
52
|
+
failure_count: failed_count,
|
53
|
+
failure_descriptions: concat_failure_descriptions
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def cleanup
|
58
|
+
FileUtils.rm('.results.xml')
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def calculate_duration
|
64
|
+
output[:results].map do |example|
|
65
|
+
example[:time]
|
66
|
+
end.inject(:+)
|
67
|
+
end
|
68
|
+
|
69
|
+
def concat_failure_descriptions
|
70
|
+
output["testcase"].reduce([]) do |errors, example|
|
71
|
+
if example.has_key?("failure")
|
72
|
+
errors << example.map{|k, v| "#{k}: #{v}"}
|
73
|
+
end
|
74
|
+
errors
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -1,35 +1,28 @@
|
|
1
1
|
require 'open3'
|
2
2
|
|
3
3
|
module LearnTest
|
4
|
-
module
|
4
|
+
module Pytest
|
5
5
|
class RequirementsChecker
|
6
6
|
def self.check_installation
|
7
|
-
new.check_installation
|
8
|
-
end
|
9
|
-
|
10
|
-
def check_installation
|
11
7
|
PythonChecker.check
|
12
8
|
PipChecker.check
|
9
|
+
PytestChecker.check
|
13
10
|
end
|
14
11
|
end
|
15
12
|
|
16
13
|
class PythonChecker
|
17
14
|
def self.check
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
def check
|
22
|
-
if !python_installed? || !correct_python_version?
|
15
|
+
if !self.python_installed? || !self.correct_python_version?
|
23
16
|
puts "Please install python 2.7.x or 3.x.x"
|
24
17
|
exit
|
25
18
|
end
|
26
19
|
end
|
27
20
|
|
28
|
-
def python_installed?
|
21
|
+
def self.python_installed?
|
29
22
|
!`which python`.empty?
|
30
23
|
end
|
31
24
|
|
32
|
-
def correct_python_version?
|
25
|
+
def self.correct_python_version?
|
33
26
|
output = Open3.popen2e('python', '--version')
|
34
27
|
version = output[1].read.strip
|
35
28
|
!!version.match(/ 2.7.*| 3.*/)
|
@@ -38,20 +31,29 @@ module LearnTest
|
|
38
31
|
|
39
32
|
class PipChecker
|
40
33
|
def self.check
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
def check
|
45
|
-
if !pip_installed?
|
34
|
+
if !self.pip_installed?
|
46
35
|
puts "Please ensure pip is installed"
|
47
36
|
exit
|
48
37
|
end
|
49
38
|
end
|
50
39
|
|
51
|
-
def pip_installed?
|
40
|
+
def self.pip_installed?
|
52
41
|
!`which pip`.empty?
|
53
42
|
end
|
54
43
|
end
|
44
|
+
|
45
|
+
class PytestChecker
|
46
|
+
def self.check
|
47
|
+
if !self.pytest_installed?
|
48
|
+
puts "Please ensure pytest is installed"
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.pytest_installed?
|
54
|
+
!`which pytest`.empty?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
55
58
|
end
|
56
59
|
end
|
57
|
-
|
data/lib/learn_test/version.rb
CHANGED
@@ -16,44 +16,47 @@ describe LearnTest::Strategies::Mocha do
|
|
16
16
|
}
|
17
17
|
}
|
18
18
|
end
|
19
|
+
|
19
20
|
let(:runner) { double("Runner", options: {}) }
|
20
21
|
let(:strategy) { LearnTest::Strategies::Mocha.new(runner) }
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
context "node_modules/ does not exist" do
|
24
|
+
it "returns true" do
|
25
|
+
allow(File).to receive(:exist?).with("node_modules").and_return(false)
|
26
|
+
expect(strategy.missing_dependencies?).to eq(true)
|
27
|
+
end
|
26
28
|
end
|
27
29
|
|
28
|
-
|
30
|
+
|
31
|
+
context "node_modules/ exists" do
|
29
32
|
before(:each) do
|
30
|
-
allow(File).to receive(:
|
33
|
+
allow(File).to receive(:exist?).and_return(true)
|
34
|
+
allow(strategy).to receive(:js_package).and_return(package)
|
31
35
|
end
|
32
36
|
|
33
37
|
it "returns true if missing a dependency" do
|
34
|
-
|
35
|
-
expect(
|
36
|
-
expect(strategy.missing_dependencies?(package)).to eq(true)
|
38
|
+
allow(File).to receive(:exist?).with("node_modules/dep2").and_return(false)
|
39
|
+
expect(strategy.missing_dependencies?).to eq(true)
|
37
40
|
end
|
38
41
|
|
39
42
|
it "returns true if missing a devDependency" do
|
40
|
-
|
41
|
-
expect(
|
42
|
-
expect(strategy.missing_dependencies?(package)).to eq(true)
|
43
|
+
allow(File).to receive(:exist?).with("node_modules/devDep2").and_return(false)
|
44
|
+
expect(strategy.missing_dependencies?).to eq(true)
|
43
45
|
end
|
44
46
|
|
45
47
|
it "returns true if missing a peerDependency" do
|
46
|
-
|
47
|
-
expect(
|
48
|
-
expect(strategy.missing_dependencies?(package)).to eq(true)
|
48
|
+
allow(File).to receive(:exist?).with("node_modules/peerDep2").and_return(false)
|
49
|
+
expect(strategy.missing_dependencies?).to eq(true)
|
49
50
|
end
|
50
51
|
|
51
52
|
it "returns false if missing no dependencies" do
|
52
|
-
|
53
|
+
allow(File).to receive(:exist?).and_return(true)
|
54
|
+
expect(strategy.missing_dependencies?).to eq(false)
|
53
55
|
end
|
54
56
|
|
55
57
|
it "returns false if there are no dependencies" do
|
56
|
-
|
58
|
+
allow(strategy).to receive(:js_package).and_return({})
|
59
|
+
expect(strategy.missing_dependencies?).to eq(false)
|
57
60
|
end
|
58
61
|
end
|
59
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: learn-test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flatiron School
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -289,9 +289,8 @@ files:
|
|
289
289
|
- lib/learn_test/strategies/karma/karma.conf.js
|
290
290
|
- lib/learn_test/strategies/mocha.rb
|
291
291
|
- lib/learn_test/strategies/protractor.rb
|
292
|
-
- lib/learn_test/strategies/
|
293
|
-
- lib/learn_test/strategies/
|
294
|
-
- lib/learn_test/strategies/python_unittest/requirements_checker.rb
|
292
|
+
- lib/learn_test/strategies/pytest.rb
|
293
|
+
- lib/learn_test/strategies/pytest/requirements_checker.rb
|
295
294
|
- lib/learn_test/strategies/rspec.rb
|
296
295
|
- lib/learn_test/strategy.rb
|
297
296
|
- lib/learn_test/user_id_parser.rb
|
@@ -336,10 +335,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
336
335
|
version: '0'
|
337
336
|
requirements: []
|
338
337
|
rubyforge_project:
|
339
|
-
rubygems_version: 2.6
|
338
|
+
rubygems_version: 2.7.6
|
340
339
|
signing_key:
|
341
340
|
specification_version: 4
|
342
|
-
summary: Runs RSpec, Jasmine, Karma, Mocha, and Python
|
341
|
+
summary: Runs RSpec, Jasmine, Karma, Mocha, and Python Pytest Test builds and pushes
|
343
342
|
JSON output to Learn.
|
344
343
|
test_files:
|
345
344
|
- spec/features/jasmine_jquery_fixtures_spec.rb
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require_relative 'python_unittest/requirements_checker'
|
2
|
-
require_relative 'python_unittest/nose_installer'
|
3
|
-
|
4
|
-
module LearnTest
|
5
|
-
module Strategies
|
6
|
-
class PythonUnittest < LearnTest::Strategy
|
7
|
-
def service_endpoint
|
8
|
-
'/e/flatiron_unittest'
|
9
|
-
end
|
10
|
-
|
11
|
-
def detect
|
12
|
-
test_files.any? {|f| f.match(/.*\.py$/) }
|
13
|
-
end
|
14
|
-
|
15
|
-
def check_dependencies
|
16
|
-
LearnTest::PythonUnittest::RequirementsChecker.check_installation
|
17
|
-
LearnTest::PythonUnittest::NoseInstaller.install
|
18
|
-
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
system("nosetests #{options[:argv].join(' ')} --verbose --with-json --json-file='./.results.json'")
|
22
|
-
end
|
23
|
-
|
24
|
-
def output
|
25
|
-
@output ||= Oj.load(File.read('.results.json'), symbol_keys: true)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_files
|
29
|
-
@test_files ||= Dir.glob("**/*_test.py")
|
30
|
-
end
|
31
|
-
|
32
|
-
def results
|
33
|
-
{
|
34
|
-
username: username,
|
35
|
-
github_user_id: user_id,
|
36
|
-
learn_oauth_token: learn_oauth_token,
|
37
|
-
repo_name: runner.repo,
|
38
|
-
build: {
|
39
|
-
test_suite: [{
|
40
|
-
framework: 'unittest',
|
41
|
-
formatted_output: output,
|
42
|
-
duration: calculate_duration
|
43
|
-
}]
|
44
|
-
},
|
45
|
-
examples: output[:stats][:total],
|
46
|
-
passing_count: output[:stats][:passes],
|
47
|
-
pending_count: output[:stats][:skipped],
|
48
|
-
failure_count: output[:stats][:errors],
|
49
|
-
failure_descriptions: concat_failure_descriptions
|
50
|
-
}
|
51
|
-
end
|
52
|
-
|
53
|
-
def cleanup
|
54
|
-
FileUtils.rm('.results.json')
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def calculate_duration
|
60
|
-
output[:results].map do |example|
|
61
|
-
example[:time]
|
62
|
-
end.inject(:+)
|
63
|
-
end
|
64
|
-
|
65
|
-
def concat_failure_descriptions
|
66
|
-
output[:results].select do |example|
|
67
|
-
example[:type] == 'failure'
|
68
|
-
end.map { |ex| ex[:tb] }.join(';')
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module LearnTest
|
2
|
-
module PythonUnittest
|
3
|
-
class NoseInstaller
|
4
|
-
def self.install
|
5
|
-
new.install
|
6
|
-
end
|
7
|
-
|
8
|
-
def install
|
9
|
-
install_nose
|
10
|
-
install_nose_json
|
11
|
-
end
|
12
|
-
|
13
|
-
def install_nose
|
14
|
-
if !nose_installed?
|
15
|
-
`easy_install nose`
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def nose_installed?
|
20
|
-
!`which nosetests`.empty?
|
21
|
-
end
|
22
|
-
|
23
|
-
def install_nose_json
|
24
|
-
if !nose_json_installed?
|
25
|
-
`pip install nose-json`
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def nose_json_installed?
|
30
|
-
!`pip show nose-json`.empty?
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|