berl 1.0.1
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 +7 -0
- data/exe/berl +5 -0
- data/lib/berl/application.rb +22 -0
- data/lib/berl/behat_runner.rb +81 -0
- data/lib/berl/berl_module.rb +9 -0
- data/lib/berl/database_wizard.rb +44 -0
- data/lib/berl/suites_resolver.rb +21 -0
- data/lib/berl/version.rb +9 -0
- data/lib/berl.rb +12 -0
- metadata +65 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b985f2fdec9a27e3b71783c2dfd9eb0601dc8937127719c5efc0e86bf40cb764
|
4
|
+
data.tar.gz: f2200d3200870cf1ab3098ad884d63ed88fe88c9705e55913137a8a54830911b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a88c86d2b61cea104976e86a2546b9980067839a4b36ab594b0259815065bc0e8122a0e50450d8d8d231aeba1848ce53717bc29833fc221d38b975102cc72aef
|
7
|
+
data.tar.gz: 0a8430a7c91350c99ca9d750dfc0301671199c14c668cc7fb65a4d72649f3473ea58cf84440373399680a4c2d5ec3fdd96617da5f2d33e79a73fcf892a373697
|
data/exe/berl
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Berl
|
4
|
+
class Application
|
5
|
+
def run
|
6
|
+
start = Time.now
|
7
|
+
|
8
|
+
number_of_workers = ENV['PARALLELE_WORKERS'].to_s.to_i
|
9
|
+
|
10
|
+
database_wizard = DatabaseWizard.new
|
11
|
+
database_wizard.initialize_num_of_databases(number_of_workers)
|
12
|
+
suites = SuitesResolver.resolve_suites
|
13
|
+
|
14
|
+
behat_runner = BehatRunner.new(number_of_workers, suites, database_wizard.databases)
|
15
|
+
behat_runner.start
|
16
|
+
|
17
|
+
behat_runner.print_errors
|
18
|
+
|
19
|
+
puts "Finished in #{Time.now - start} seconds"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Berl
|
4
|
+
# Service to run Behat tests
|
5
|
+
class BehatRunner
|
6
|
+
attr_reader :num_of_succeed, :num_of_failed
|
7
|
+
|
8
|
+
def initialize(num_of_workers, suites, databases)
|
9
|
+
@num_of_succeed = 0
|
10
|
+
@num_of_failed = 0
|
11
|
+
@num_of_workers = num_of_workers
|
12
|
+
@suites = suites
|
13
|
+
@databases = databases
|
14
|
+
@output = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def start
|
18
|
+
Parallel.each(
|
19
|
+
@suites,
|
20
|
+
in_processes: @num_of_workers,
|
21
|
+
finish: method(:handle_finish)
|
22
|
+
) do |suite|
|
23
|
+
database = @databases[Parallel.worker_number]
|
24
|
+
cache = "cache_#{Parallel.worker_number}"
|
25
|
+
|
26
|
+
behat_cmd = build_behat_cmd(database, cache, suite)
|
27
|
+
Open3.popen3(behat_cmd) do |_, stdout, _, wait_thr|
|
28
|
+
result = {}
|
29
|
+
result['output'] = []
|
30
|
+
|
31
|
+
result['output'].push(*stdout.readlines) if wait_thr.value != 0
|
32
|
+
|
33
|
+
result['suite_name'] = suite
|
34
|
+
result['status'] = wait_thr.value == 0 ? 'success' : 'fail'
|
35
|
+
|
36
|
+
result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def build_behat_cmd(database, cache, suite)
|
42
|
+
cmd = []
|
43
|
+
cmd.push("DATABASE_URL=#{database}")
|
44
|
+
cmd.push("PARALLELE_CACHE_DIR=#{cache}")
|
45
|
+
cmd.push("php vendor/bin/behat --suite='#{suite}'")
|
46
|
+
cmd.push("--tags='~@javascript&&~@todo&&~@cli'")
|
47
|
+
cmd.push('--colors --strict --no-interaction -vvv -f progress')
|
48
|
+
|
49
|
+
cmd.join(' ')
|
50
|
+
end
|
51
|
+
|
52
|
+
private :build_behat_cmd
|
53
|
+
|
54
|
+
def handle_finish(_, _, result)
|
55
|
+
if result['status'] == 'success'
|
56
|
+
@num_of_succeed += 1
|
57
|
+
puts "ā
#{result['suite_name']} (#{num_of_executed}/#{@suites.count})"
|
58
|
+
|
59
|
+
return
|
60
|
+
end
|
61
|
+
|
62
|
+
@num_of_failed += 1
|
63
|
+
@output[result['suite_name']] = result['output']
|
64
|
+
puts "ā #{result['suite_name']} (#{num_of_executed}/#{@suites.count})"
|
65
|
+
end
|
66
|
+
|
67
|
+
def num_of_executed
|
68
|
+
@num_of_succeed + @num_of_failed
|
69
|
+
end
|
70
|
+
|
71
|
+
private :num_of_executed
|
72
|
+
|
73
|
+
def print_errors
|
74
|
+
puts "\n\n šØ Errors for failed suites:"
|
75
|
+
@output.each do |suite_name, output|
|
76
|
+
puts "\nā #{suite_name}"
|
77
|
+
puts output
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parallel'
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
# Service to setup databases
|
7
|
+
class DatabaseWizard
|
8
|
+
attr_reader :databases
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@databases = []
|
12
|
+
@num_of_set_up_databases = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize_num_of_databases(num_of_databases)
|
16
|
+
Parallel.each(1..num_of_databases, in_processes: 4, finish: method(:handle_finish)) do |i|
|
17
|
+
database_connection_string = "mysql://root:root_password@db/sylius_#{i}?charset=utf8mb4"
|
18
|
+
|
19
|
+
setup_db_cmd = build_setup_db_cmd(database_connection_string)
|
20
|
+
Open3.popen3(setup_db_cmd) do |_, _, _, _|
|
21
|
+
database_connection_string
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_setup_db_cmd(database)
|
27
|
+
cmd = []
|
28
|
+
cmd.push("DATABASE_URL=#{database} php bin/console doctrine:database:create --if-not-exists -e test")
|
29
|
+
cmd.push("DATABASE_URL=#{database} php bin/console doctrine:schema:update -f -e test")
|
30
|
+
cmd.push("DATABASE_URL=#{database} php bin/console sylius:fixture:load -n -e test")
|
31
|
+
|
32
|
+
cmd.join(' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
private :build_setup_db_cmd
|
36
|
+
|
37
|
+
def handle_finish(_, _, result)
|
38
|
+
@num_of_set_up_databases += 1
|
39
|
+
puts "š§ Database #{@num_of_set_up_databases} set up"
|
40
|
+
@databases.push(result)
|
41
|
+
end
|
42
|
+
|
43
|
+
private :handle_finish
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Service to resolve suites
|
4
|
+
class SuitesResolver
|
5
|
+
def self.resolve_suites
|
6
|
+
suites_path = ENV['PARALLELE_SCENARIOS_PATH']
|
7
|
+
|
8
|
+
files = Dir.glob("#{Dir.pwd}/#{suites_path}/**/*.{yml,yaml}")
|
9
|
+
suites = []
|
10
|
+
|
11
|
+
files.each do |path|
|
12
|
+
content = IO.read(path)
|
13
|
+
match = content.match(/\s+((api|ui|domain)[^:]+)/)
|
14
|
+
suite = match.to_s.strip
|
15
|
+
|
16
|
+
suites.push(suite) if suite.length.positive?
|
17
|
+
end
|
18
|
+
|
19
|
+
suites
|
20
|
+
end
|
21
|
+
end
|
data/lib/berl/version.rb
ADDED
data/lib/berl.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Berl; end
|
4
|
+
|
5
|
+
require 'singleton'
|
6
|
+
|
7
|
+
require 'berl/application'
|
8
|
+
require 'berl/behat_runner'
|
9
|
+
require 'berl/berl_module'
|
10
|
+
require 'berl/database_wizard'
|
11
|
+
require 'berl/suites_resolver'
|
12
|
+
require 'berl/version'
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: berl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jakub Tobiasz
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-01-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: parallel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.21'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.21'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- jakub@alphpaca.io
|
30
|
+
executables:
|
31
|
+
- berl
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- exe/berl
|
36
|
+
- lib/berl.rb
|
37
|
+
- lib/berl/application.rb
|
38
|
+
- lib/berl/behat_runner.rb
|
39
|
+
- lib/berl/berl_module.rb
|
40
|
+
- lib/berl/database_wizard.rb
|
41
|
+
- lib/berl/suites_resolver.rb
|
42
|
+
- lib/berl/version.rb
|
43
|
+
homepage:
|
44
|
+
licenses: []
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.2.0
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubygems_version: 3.4.1
|
62
|
+
signing_key:
|
63
|
+
specification_version: 4
|
64
|
+
summary: Parallel Behat runner
|
65
|
+
test_files: []
|