cs-bdd 0.0.5 → 0.1.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 +4 -4
- data/Gemfile +5 -0
- data/bin/cs-bdd +126 -69
- data/bin/cs-bdd-helpers.rb +50 -55
- data/cs-bdd.gemspec +3 -0
- data/lib/cs/bdd/locales/en.yml +18 -0
- data/lib/cs/bdd/locales/pt.yml +18 -0
- data/lib/cs/bdd/version.rb +1 -1
- data/lib/skeleton/config/scripts/android/run_tests_all_devices.sh +17 -6
- data/lib/skeleton/config/scripts/ios/run_tests_all_devices.sh +7 -3
- data/lib/skeleton/features/android/android_screen_base.rb +5 -9
- data/lib/skeleton/features/ios/ios_screen_base.rb +13 -10
- data/lib/skeleton/features/ios/support/01_launch.rb +33 -12
- data/lib/templates/base_steps.tt +38 -0
- data/lib/templates/feature.tt +8 -0
- data/lib/{skeleton/features/android/screens/example_screen.rb → templates/screen.tt} +4 -4
- data/lib/templates/steps.tt +5 -0
- metadata +50 -12
- data/bin/cs-bdd-generate.rb +0 -11
- data/lib/examples/example.feature +0 -7
- data/lib/examples/example_screen.rb +0 -15
- data/lib/examples/example_steps.rb +0 -5
- data/lib/skeleton/features/android/features/android.feature +0 -9
- data/lib/skeleton/features/example.feature +0 -9
- data/lib/skeleton/features/ios/features/ios.feature +0 -9
- data/lib/skeleton/features/ios/screens/example_screen.rb +0 -0
- data/lib/skeleton/features/step_definitions/base_steps.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e38a42a921fdc0a1307703e4189a74192a35c6ae
|
4
|
+
data.tar.gz: 15b44bd418b4855ab0159ed539d336f077d62579
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b97da3a3559e75cf7f2b269177055067c6a27c5a73b1a9f7f608046350ba5397c500922b5349ee5fa19444accf65127ab39501759c8b0aaf34dffa4d5fa64fd
|
7
|
+
data.tar.gz: a40f6ca84b956b0fc230680ab0a2351f0ce6efb586d60d3cfc55e2b4b2a88bb4219af27146c28f4da18b31ccf3828ab03186fa1da116695d740891614d1d7783
|
data/Gemfile
CHANGED
data/bin/cs-bdd
CHANGED
@@ -1,93 +1,150 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require 'thor'
|
4
|
+
require 'thor/group'
|
5
|
+
require 'i18n'
|
6
|
+
require 'gherkin' # Used here as a translation source
|
7
|
+
require 'json'
|
8
|
+
require 'yaml'
|
4
9
|
|
5
|
-
require 'fileutils'
|
6
|
-
require 'rbconfig'
|
7
|
-
require_relative '../lib/cs/bdd/version'
|
8
|
-
|
9
|
-
# for ruby 1.9.1 and earlier
|
10
|
-
unless defined? RbConfig.ruby
|
11
|
-
def RbConfig.ruby
|
12
|
-
File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"])
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
require File.join(File.dirname(__FILE__), "cs-bdd-generate")
|
17
10
|
require File.join(File.dirname(__FILE__), "cs-bdd-helpers")
|
11
|
+
require_relative '../lib/cs/bdd/version'
|
18
12
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@android_dir = File.join(@features_dir, "android" )
|
24
|
-
@ios_dir = File.join(@features_dir, "ios" )
|
25
|
-
|
26
|
-
if ARGV.length == 0
|
27
|
-
print_usage
|
28
|
-
else
|
29
|
-
cmd = ARGV.shift
|
30
|
-
|
31
|
-
case cmd
|
32
|
-
when 'new', 'n'
|
33
|
-
if ARGV.empty?
|
34
|
-
puts "Please specify the project name"
|
35
|
-
exit 1
|
36
|
-
else
|
37
|
-
@project_dir = File.join(FileUtils.pwd, ARGV.first)
|
38
|
-
generate_skeleton
|
39
|
-
end
|
40
|
-
when 'generate', 'g'
|
41
|
-
|
42
|
-
# Looks if the user is in the root folder of the project
|
43
|
-
unless Dir.exists? File.join(FileUtils.pwd, "features", "android", "features")
|
44
|
-
puts "Please run this command on the root folder of the project"
|
45
|
-
exit 1
|
46
|
-
end
|
47
|
-
|
48
|
-
if ARGV.empty?
|
49
|
-
puts "Please inform the generator that will be used. Type cs-bdd to see the usage info."
|
50
|
-
exit 1
|
51
|
-
else
|
52
|
-
generator = ARGV.shift
|
53
|
-
|
54
|
-
if ARGV.empty?
|
55
|
-
puts "Please specify the name of the resource to be generated."
|
56
|
-
exit 1
|
57
|
-
end
|
13
|
+
module CS
|
14
|
+
module BDD
|
15
|
+
class Generate < Thor
|
16
|
+
include Thor::Actions
|
58
17
|
|
59
|
-
|
18
|
+
desc "feature [RESOURCE_NAME]", "Generates an OS independent feature"
|
19
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
20
|
+
def feature name
|
21
|
+
I18n.config.default_locale = options[:lang]
|
22
|
+
in_root_project_folder?
|
60
23
|
|
61
|
-
case generator
|
62
|
-
when 'feature'
|
63
24
|
create_feature_file name
|
64
25
|
create_steps_file name
|
65
|
-
create_screen_file name, 'IOS'
|
66
26
|
create_screen_file name, 'Android'
|
67
|
-
|
27
|
+
create_screen_file name, 'IOS'
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "aFeature [RESOURCE_NAME]", "Generates an Android dependent feature"
|
31
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
32
|
+
def aFeature name
|
33
|
+
I18n.config.default_locale = options[:lang]
|
34
|
+
in_root_project_folder?
|
35
|
+
|
68
36
|
create_feature_file name, 'Android'
|
69
37
|
create_steps_file name, 'Android'
|
70
38
|
create_screen_file name, 'Android'
|
71
|
-
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "iFeature [RESOURCE_NAME]", "Generates an iOS dependent feature"
|
42
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
43
|
+
def iFeature name
|
44
|
+
I18n.config.default_locale = options[:lang]
|
45
|
+
in_root_project_folder?
|
46
|
+
|
72
47
|
create_feature_file name, 'IOS'
|
73
48
|
create_steps_file name, 'IOS'
|
74
49
|
create_screen_file name, 'IOS'
|
75
|
-
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "step [RESOURCE_NAME]", "Generates an OS independent step"
|
53
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
54
|
+
def step name
|
55
|
+
I18n.config.default_locale = options[:lang]
|
56
|
+
in_root_project_folder?
|
76
57
|
create_steps_file name
|
77
|
-
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "aStep [RESOURCE_NAME]", "Generates an Android dependent step"
|
61
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
62
|
+
def aStep name
|
63
|
+
I18n.config.default_locale = options[:lang]
|
64
|
+
in_root_project_folder?
|
78
65
|
create_steps_file name, 'Android'
|
79
|
-
|
66
|
+
end
|
67
|
+
|
68
|
+
desc "iStep [RESOURCE_NAME]", "Generates an iOS dependent step"
|
69
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
70
|
+
def iStep name
|
71
|
+
I18n.config.default_locale = options[:lang]
|
72
|
+
in_root_project_folder?
|
80
73
|
create_steps_file name, 'IOS'
|
81
|
-
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "aScreen [RESOURCE_NAME]", "Generates an Android dependent screen"
|
77
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
78
|
+
def aScreen name
|
79
|
+
I18n.config.default_locale = options[:lang]
|
80
|
+
in_root_project_folder?
|
82
81
|
create_screen_file name, 'Android'
|
83
|
-
|
82
|
+
end
|
83
|
+
|
84
|
+
desc "iScreen [RESOURCE_NAME]", "Generates an iOS dependent screen"
|
85
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
86
|
+
def iScreen name
|
87
|
+
I18n.config.default_locale = options[:lang]
|
88
|
+
in_root_project_folder?
|
84
89
|
create_screen_file name, 'IOS'
|
85
90
|
end
|
91
|
+
|
92
|
+
def self.source_root
|
93
|
+
File.join( File.dirname(__FILE__), '..', 'lib', 'templates' )
|
94
|
+
end
|
86
95
|
end
|
87
|
-
when 'version', 'v'
|
88
|
-
puts CS::BDD::VERSION
|
89
|
-
else
|
90
|
-
puts "Invalid command '#{cmd}'"
|
91
|
-
print_usage
|
92
96
|
end
|
93
|
-
end
|
97
|
+
end
|
98
|
+
|
99
|
+
module CS
|
100
|
+
module BDD
|
101
|
+
class CsBddRunner < Thor
|
102
|
+
include Thor::Actions
|
103
|
+
|
104
|
+
default_task :help
|
105
|
+
|
106
|
+
register CS::BDD::Generate, 'generate', 'generate [GENERATOR] [RESOURCE_NAME]', 'Generates various resources'
|
107
|
+
|
108
|
+
desc "new PROJECT_NAME", "Generates the structure of a new project that uses Calabash in both Android and iOS apps"
|
109
|
+
option :lang, :banner => "any of the gherkin supported languages", :default => :en
|
110
|
+
def new name
|
111
|
+
I18n.config.default_locale = options[:lang]
|
112
|
+
# Thor will be responsible to look for identical files and possibles conflicts
|
113
|
+
directory File.join( File.dirname(__FILE__), '..', 'lib', 'skeleton' ), name
|
114
|
+
|
115
|
+
# Copying base steps file with localization
|
116
|
+
template( "base_steps", File.join(name, 'features', 'step_definitions', 'base_steps.rb') )
|
117
|
+
end
|
118
|
+
|
119
|
+
desc "version", "Shows the gem version"
|
120
|
+
def version
|
121
|
+
puts "cs-bdd Version #{CS::BDD::VERSION}"
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.source_root
|
125
|
+
File.join( File.dirname(__FILE__), '..', 'lib', 'templates' )
|
126
|
+
end
|
127
|
+
|
128
|
+
# Overriding the initialize method to load all the translations supported by the gem gherkin
|
129
|
+
def initialize(*args)
|
130
|
+
super
|
131
|
+
# Loading gherkin accepted translations
|
132
|
+
translations_file_path = File.join(Gem.loaded_specs['gherkin'].full_gem_path, 'lib', 'gherkin', 'i18n.json')
|
133
|
+
# Parsing the JSON file
|
134
|
+
# Removing the sequence *| and all the alternative options for the gherkin translations
|
135
|
+
translations_json = JSON.parse( File.read( translations_file_path ).gsub(/\*\|/, "").gsub( /\|.*\"/, '"') )
|
136
|
+
# Converting the translations to YAML and storing in a temp file
|
137
|
+
translations_temp_file = Tempfile.new( ["translations", ".yml"] )
|
138
|
+
File.write( translations_temp_file, translations_json.to_yaml )
|
139
|
+
# Loading the translations from gherkin and from the locales folder of this gem
|
140
|
+
locales_folder_path = File.join( File.dirname(__FILE__), '..', 'lib', 'cs', 'bdd', 'locales' )
|
141
|
+
I18n.load_path = Dir[translations_temp_file, File.join(locales_folder_path, "*.yml")]
|
142
|
+
I18n.backend.load_translations
|
143
|
+
I18n.config.enforce_available_locales = true
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
CS::BDD::CsBddRunner.start
|
data/bin/cs-bdd-helpers.rb
CHANGED
@@ -1,73 +1,68 @@
|
|
1
|
-
def print_usage
|
2
|
-
puts <<EOF
|
3
|
-
Usage: cs-bdd <command-name> [parameters]
|
4
|
-
<command-name> can be one of
|
5
|
-
new or n <project_name>
|
6
|
-
generate a project folder structure
|
7
|
-
\033[0;32mEx.: cs-bdd n project_name\033[0m
|
8
|
-
generate or g <type> <name>
|
9
|
-
generate a Feature or Step Definition or Screen file
|
10
|
-
<type> can be one of
|
11
|
-
feature -> Generate all files that composes an OS independenty feature
|
12
|
-
aFeature -> Generate all files that composes an Android feature
|
13
|
-
iFeature -> Generate all files that composes an iOS feature
|
14
|
-
step -> Generate an OS independenty step
|
15
|
-
aStep -> Generate a step that will be loaded only in Android
|
16
|
-
iStep -> Generate a step that will be loaded only in iOS
|
17
|
-
aScreen -> Generate an Android screen
|
18
|
-
iScreen -> Generate an iOS screen
|
19
|
-
\033[0;32mEx.: cs-bdd g aFeature Feature_name\033[0m
|
20
|
-
version or v
|
21
|
-
prints the gem version
|
22
|
-
\033[0;32mEx.: cs-bdd v\033[0m
|
23
|
-
EOF
|
24
|
-
end
|
25
|
-
|
26
1
|
def create_feature_file name, platform = nil
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
# Updating the contents with the name passed as an option
|
31
|
-
content = content.gsub( "|Name|", name.capitalize )
|
2
|
+
|
3
|
+
# options used to generate the file in the template function
|
4
|
+
opts = {:name => camelize(name)}
|
32
5
|
|
33
6
|
# If platform is not nil than the feature is OS dependent
|
34
|
-
|
7
|
+
file_path = ""
|
35
8
|
if platform.nil?
|
36
|
-
|
37
|
-
|
9
|
+
file_path = File.join( FileUtils.pwd, "features", "#{name.downcase}.feature" )
|
10
|
+
opts[:platform] = ""
|
38
11
|
else
|
39
|
-
|
40
|
-
|
12
|
+
file_path = File.join( FileUtils.pwd, "features", platform.downcase, "features", "#{name.downcase}.feature" )
|
13
|
+
opts[:platform] = platform
|
41
14
|
end
|
42
15
|
|
43
|
-
#
|
44
|
-
|
16
|
+
# Thor creates a file based on the templates/feature.tt template
|
17
|
+
template( "feature", file_path, opts )
|
45
18
|
end
|
46
19
|
|
47
20
|
def create_steps_file name, platform = nil
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
21
|
+
|
22
|
+
# options used to generate the file in the template function
|
23
|
+
opts = {:name => camelize(name)}
|
24
|
+
|
25
|
+
# If platform is not nil than the step is OS dependent
|
26
|
+
file_path = nil
|
53
27
|
if platform.nil?
|
54
|
-
|
28
|
+
file_path = File.join( FileUtils.pwd, "features", "step_definitions", "#{name.downcase}_steps.rb" )
|
29
|
+
opts[:platform] = ""
|
55
30
|
else
|
56
|
-
|
31
|
+
file_path = File.join( FileUtils.pwd, "features", platform.downcase, "step_definitions", "#{name.downcase}_steps.rb" )
|
32
|
+
opts[:platform] = platform
|
57
33
|
end
|
58
34
|
|
59
|
-
#
|
60
|
-
|
35
|
+
# Thor creates a file based on the templates/steps.tt template
|
36
|
+
template( "steps", file_path, opts )
|
61
37
|
end
|
62
38
|
|
63
39
|
def create_screen_file name, platform
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
40
|
+
|
41
|
+
# options used to generate the file in the template function
|
42
|
+
opts = {:name => camelize(name), :platform => platform}
|
43
|
+
|
44
|
+
# Thor creates a file based on the templates/screen.tt template
|
45
|
+
template( "screen", File.join( FileUtils.pwd, "features", platform.downcase, "screens", "#{name.downcase}_screen.rb"), opts )
|
46
|
+
end
|
47
|
+
|
48
|
+
def camelize string
|
49
|
+
|
50
|
+
camelized = ""
|
51
|
+
|
52
|
+
string.split("_").each do |s|
|
53
|
+
camelized = camelized + s.capitalize
|
54
|
+
end
|
55
|
+
|
56
|
+
return camelized
|
57
|
+
end
|
58
|
+
|
59
|
+
def in_root_project_folder?
|
60
|
+
# Looks if the user is in the root folder of the project
|
61
|
+
if !Dir.exists? File.join(FileUtils.pwd, "features", "android", "features") or
|
62
|
+
!Dir.exists? File.join(FileUtils.pwd, "features", "ios", "features")
|
63
|
+
puts "Please run this command on the root folder of the project"
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
|
67
|
+
return true
|
73
68
|
end
|
data/cs-bdd.gemspec
CHANGED
@@ -20,4 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "thor", "~> 0.19.1"
|
24
|
+
spec.add_development_dependency "i18n", "~> 0.6.11"
|
25
|
+
spec.add_development_dependency "gherkin", "~> 2.12.2"
|
23
26
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
en:
|
2
|
+
android_only: "(Android Only)"
|
3
|
+
ios_only: "(iOS Only)"
|
4
|
+
first_scenario: "First Scenario"
|
5
|
+
comments:
|
6
|
+
trait: "The screen identificator"
|
7
|
+
insert_steps: "Insert steps"
|
8
|
+
elements: "Declare all the elements of this screen"
|
9
|
+
actions: "Declare all actions of this screen"
|
10
|
+
steps:
|
11
|
+
drag_until: "I (?:drag|dragged) the screen (down|up|left|right) until I see the element"
|
12
|
+
page_contains: "I am on a page that contains"
|
13
|
+
drag_number_of_times: 'I drag the screen (left|right|down|up) (\d+) times'
|
14
|
+
touch_element: 'I (?:touch|touched) the "(.*?)" element'
|
15
|
+
drag_screen: "I drag the screen (down|up|left|right)"
|
16
|
+
wait_progress_bar: "I (?:wait|waited) for the progress bar to vanish"
|
17
|
+
should_see_page: "I should see the page"
|
18
|
+
should_see_page_that_contains: "I should see a page that contains"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
pt:
|
2
|
+
android_only: "(Somente Android)"
|
3
|
+
ios_only: "(Somente iOS)"
|
4
|
+
first_scenario: "Primeiro Cenário"
|
5
|
+
comments:
|
6
|
+
trait: "Identificador da tela"
|
7
|
+
insert_steps: "Insira os passos"
|
8
|
+
elements: "Declare todos os elementos da tela"
|
9
|
+
actions: "Declare todas as ações da tela"
|
10
|
+
steps:
|
11
|
+
drag_until: "que Eu (?:arrastei|arrasto) a tela para (baixo|cima|esquerda|direita) até ver o elemento"
|
12
|
+
page_contains: "que Eu estou em uma página que contem"
|
13
|
+
drag_number_of_times: 'Eu arrasto a tela para (esquerda|direita|baixo|cima) (\d+) vezes'
|
14
|
+
touch_element: 'Eu (?:clico|cliquei) no elemento "(.*?)"'
|
15
|
+
drag_screen: "Eu arrasto a tela para (baixo|cima|esquerda|direita)"
|
16
|
+
wait_progress_bar: "Eu (?:espero|esperei) até a barar de progresso sumir"
|
17
|
+
should_see_page: "Eu deveria ver a página"
|
18
|
+
should_see_page_that_contains: "Eu deveria ver uma página que contem"
|
data/lib/cs/bdd/version.rb
CHANGED
@@ -7,18 +7,29 @@
|
|
7
7
|
|
8
8
|
|
9
9
|
## CODE BEGIN #############################################################
|
10
|
-
echo
|
10
|
+
[ $# -ne 1 ] && echo "Wrong number of parameters." && exit 1
|
11
|
+
|
12
|
+
echo Inicio da execução: $(date)
|
13
|
+
|
14
|
+
reports_path="/var/www/html/reports/$(date +"%Y%d%m")"
|
15
|
+
|
11
16
|
for device in $(adb devices | grep "device$" | cut -f 1)
|
12
17
|
do
|
13
|
-
rm -r $
|
14
|
-
mkdir -p $
|
18
|
+
rm -r "$reports_path"/"$device" &> /dev/null
|
19
|
+
mkdir -p "$reports_path"/"$device" &> /dev/null
|
15
20
|
echo $device | grep -q emulator
|
16
21
|
# SET THE IGNORE TAGS TRUE IF THE TEST ARE RUNNING IN A DEVICE
|
17
22
|
[ $? -ne 0 ] && ignore='--tags ~@ignore_if_test_in_device'
|
18
23
|
cd $WORKSPACE
|
19
|
-
ADB_DEVICE_ARG=$device SCREENSHOT_PATH
|
24
|
+
ADB_DEVICE_ARG=$device SCREENSHOT_PATH="$reports_path"/"$device"/ calabash-android run $1 -p android --format 'Calabash::Formatters::Html' --out "$reports_path"/"$device"/reports.html $ignore &
|
20
25
|
done
|
21
26
|
wait
|
22
|
-
|
23
|
-
|
27
|
+
|
28
|
+
# Calabash has a problem with images relative path, the command above will replace all the images path on the
|
29
|
+
# html report file to be a relative path
|
30
|
+
for device in $(adb devices | grep "device$" | cut -f 1)
|
31
|
+
do
|
32
|
+
sed -i 's|'"$reports_path"/"$device"/'||g' "$reports_path"/"$device"/reports.html
|
33
|
+
done
|
34
|
+
echo Fim da execução: $(date)
|
24
35
|
## CODE END #############################################################
|
@@ -15,6 +15,10 @@ if [ -z $1 ]; then
|
|
15
15
|
exit 1
|
16
16
|
fi
|
17
17
|
|
18
|
+
# Remember to install an application server to enable remote access to the reports
|
19
|
+
# Remember to previous create the reports folder and give the appropriate permissions
|
20
|
+
reports_path="/var/www/reports/$(date +"%Y%d%m")"
|
21
|
+
|
18
22
|
# Reads the devices file line by line
|
19
23
|
while read line
|
20
24
|
do
|
@@ -28,14 +32,14 @@ do
|
|
28
32
|
name="$(echo $line | cut -d'|' -f3 | tr -d ' ')"
|
29
33
|
|
30
34
|
# Cleaning the previous reports folder and ensuring its existence
|
31
|
-
rm -
|
32
|
-
mkdir -p "$
|
35
|
+
rm -r "$reports_path"/"$name" &> /dev/null
|
36
|
+
mkdir -p "$reports_path"/"$name" &> /dev/null
|
33
37
|
|
34
38
|
# Navigating to the tests root folder
|
35
39
|
cd "$WORKSPACE"
|
36
40
|
|
37
41
|
# Executing calabash for the device
|
38
|
-
APP_BUNDLE_PATH="$1" DEVICE_TARGET="$target" DEVICE_ENDPOINT="$endpoint" SCREENSHOT_PATH="$
|
42
|
+
APP_BUNDLE_PATH="$1" DEVICE_TARGET="$target" DEVICE_ENDPOINT="$endpoint" SCREENSHOT_PATH="$reports_path"/"$name"/ cucumber -p ios --format 'Calabash::Formatters::Html' --out "$reports_path"/"$name/reports.html"
|
39
43
|
|
40
44
|
done < config/scripts/ios/devices
|
41
45
|
|
@@ -41,17 +41,15 @@ class AndroidScreenBase < Calabash::ABase
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def drag_until_element_is_visible_with_special_query direction, element
|
44
|
-
drag_until_element_is_visible direction, element, "* {text CONTAINS[c] '#{
|
44
|
+
drag_until_element_is_visible direction, element, "* {text CONTAINS[c] '#{element}'}"
|
45
45
|
end
|
46
46
|
|
47
47
|
def drag_until_element_is_visible direction, element, query = nil, limit = 15
|
48
48
|
i = 0
|
49
49
|
|
50
|
-
element_text = get_translation(element)
|
51
|
-
|
52
50
|
element_query = ""
|
53
51
|
if query.nil?
|
54
|
-
element_query = "* marked:'#{
|
52
|
+
element_query = "* marked:'#{element}'"
|
55
53
|
else
|
56
54
|
element_query = query
|
57
55
|
end
|
@@ -62,7 +60,7 @@ class AndroidScreenBase < Calabash::ABase
|
|
62
60
|
i = i + 1
|
63
61
|
end
|
64
62
|
|
65
|
-
raise ("Executed #{limit} moviments #{direction.to_s} and the element '#{
|
63
|
+
raise ("Executed #{limit} moviments #{direction.to_s} and the element '#{element}' was not found on this view!") unless i < limit
|
66
64
|
end
|
67
65
|
|
68
66
|
def drag_for_specified_number_of_times direction, times
|
@@ -73,12 +71,10 @@ class AndroidScreenBase < Calabash::ABase
|
|
73
71
|
|
74
72
|
def is_on_page? page_text
|
75
73
|
|
76
|
-
translated_page_text = get_translation(page_text)[0,50] # Using only the first 50 chars in the comparation
|
77
|
-
|
78
74
|
begin
|
79
|
-
wait_for(:timeout => 5) { has_text?
|
75
|
+
wait_for(:timeout => 5) { has_text? page_text }
|
80
76
|
rescue
|
81
|
-
raise "Unexpected Page. Expected was: '#{
|
77
|
+
raise "Unexpected Page. Expected was: '#{page_text}'"
|
82
78
|
end
|
83
79
|
end
|
84
80
|
|
@@ -56,12 +56,13 @@ class IOSScreenBase < Calabash::IBase
|
|
56
56
|
def ios_element_exists? query
|
57
57
|
second_query = nil
|
58
58
|
|
59
|
-
if query.include? "
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
if query.include? "CONTAINS[c]"
|
60
|
+
if query.include? "marked"
|
61
|
+
second_query = query.gsub( 'marked', 'accessibilityLabel' )
|
62
|
+
end
|
63
|
+
if query.include? "accessibilityLabel"
|
64
|
+
second_query = query.gsub( 'accessibilityLabel', 'marked' )
|
65
|
+
end
|
65
66
|
end
|
66
67
|
|
67
68
|
if second_query.nil?
|
@@ -69,7 +70,6 @@ class IOSScreenBase < Calabash::IBase
|
|
69
70
|
else
|
70
71
|
element_exists(query) or element_exists(second_query)
|
71
72
|
end
|
72
|
-
|
73
73
|
end
|
74
74
|
|
75
75
|
def drag_until_element_is_visible_with_special_query direction, element
|
@@ -111,10 +111,13 @@ class IOSScreenBase < Calabash::IBase
|
|
111
111
|
|
112
112
|
def enter text, element, query = nil
|
113
113
|
if query.nil?
|
114
|
-
query
|
115
|
-
else
|
116
|
-
query( query, {:setText => text} )
|
114
|
+
query = "* marked:'#{element}'"
|
117
115
|
end
|
116
|
+
|
117
|
+
touch query
|
118
|
+
sleep(1)
|
119
|
+
keyboard_enter_text text
|
120
|
+
done
|
118
121
|
end
|
119
122
|
|
120
123
|
def touch_screen_element element
|
@@ -64,21 +64,42 @@ end
|
|
64
64
|
# Install or reinstall the app on the device
|
65
65
|
def reinstall_app
|
66
66
|
|
67
|
-
|
67
|
+
# If test is in a device
|
68
|
+
if( !ENV['APP_BUNDLE_PATH'].include?( "iphonesimulator" ) )
|
68
69
|
|
69
|
-
|
70
|
-
success = system "ios-deploy -r -b #{ENV['APP_BUNDLE_PATH']} -i #{ENV['DEVICE_TARGET']} -t 5 > /dev/null"
|
70
|
+
system( "echo 'Installing the app...'" )
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
72
|
+
# Trying to reinstall the app
|
73
|
+
success = system "ios-deploy -r -b #{ENV['APP_BUNDLE_PATH']} -i #{ENV['DEVICE_TARGET']} -t 5 > /dev/null"
|
74
|
+
|
75
|
+
# If the app is not installed the above command will throw an error
|
76
|
+
# So we just install the app
|
77
|
+
if !success
|
78
|
+
success = system "ios-deploy -b #{ENV['APP_BUNDLE_PATH']} -i #{ENV['DEVICE_TARGET']} -t 5 > /dev/null"
|
79
|
+
if !success # If there is any error raises an exception
|
80
|
+
raise 'Error. Could not install the app.'
|
81
|
+
end
|
78
82
|
end
|
79
|
-
end
|
80
83
|
|
81
|
-
|
84
|
+
system( "echo 'Installed.'" )
|
85
|
+
|
86
|
+
sleep(3) # Gives to the iphone a time to finish the installation of the app
|
87
|
+
else # If test is in a simulator
|
88
|
+
|
89
|
+
# APP_BUNDLE_ID must be set in order to uninstall the app from the simulator
|
90
|
+
# You can either pass it as a parameter in the cucumber command or set it here
|
91
|
+
#ENV["APP_BUNDLE_ID"] = "bundle_id"
|
82
92
|
|
83
|
-
|
93
|
+
# Reinstalling the app using terminal commands
|
94
|
+
system( "echo 'Installing the app...'" )
|
95
|
+
|
96
|
+
# Removing the app
|
97
|
+
%x(xcrun simctl uninstall #{ENV['DEVICE_TARGET']} #{ENV["APP_BUNDLE_ID"]} > /dev/null)
|
98
|
+
|
99
|
+
# Installing the app
|
100
|
+
%x(xcrun simctl install #{ENV['DEVICE_TARGET']} #{ENV['APP_BUNDLE_PATH']} > /dev/null)
|
101
|
+
|
102
|
+
system( "echo 'Installed.'" )
|
103
|
+
|
104
|
+
end
|
84
105
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
######### <%= I18n.translate( :given ).upcase %> #########
|
2
|
+
<%= I18n.translate( :given ).capitalize %>(/^<%= I18n.translate( "steps.drag_until" ) %> "(.*?)"$/) do |direction, element|
|
3
|
+
@page.drag_until_element_is_visible_with_special_query direction.to_sym, element
|
4
|
+
end
|
5
|
+
|
6
|
+
<%= I18n.translate( :given ).capitalize %>(/^<%= I18n.translate( "steps.page_contais" ) %> '(.*?)'$/) do |page_text|
|
7
|
+
@page.is_on_page? page_text
|
8
|
+
end
|
9
|
+
|
10
|
+
######### <%= I18n.translate( :when ).upcase %> #########
|
11
|
+
|
12
|
+
<%= I18n.translate( :when ).capitalize %>(/^<%= I18n.translate( "steps.drag_number_of_times" ) %>$/) do |direction, times|
|
13
|
+
@page.drag_for_specified_number_of_times(direction.to_sym, times.to_i)
|
14
|
+
end
|
15
|
+
|
16
|
+
<%= I18n.translate( :when ).capitalize %>(/^<%= I18n.translate( "steps.touch_element" ) %>$/) do |element|
|
17
|
+
@page.touch_screen_element element
|
18
|
+
end
|
19
|
+
|
20
|
+
<%= I18n.translate( :when ).capitalize %>(/^<%= I18n.translate( "steps.drag_screen" ) %>$/) do |direction|
|
21
|
+
@page.drag_to direction.to_sym
|
22
|
+
end
|
23
|
+
|
24
|
+
######### <%= I18n.translate( :then ).upcase %> #########
|
25
|
+
|
26
|
+
<%= I18n.translate( :then ).capitalize %>(/^<%= I18n.translate "steps.wait_progress_bar" %>$/) do
|
27
|
+
# wait_for_progress is a method of the base class, so doesn't matter what is the value
|
28
|
+
# of the @page variable, because all screens will have this method
|
29
|
+
@page.wait_for_progress
|
30
|
+
end
|
31
|
+
|
32
|
+
<%= I18n.translate( :then ).capitalize %>(/^<%= I18n.translate "steps.should_see_page" %> '(.*?)'$/) do |page_text|
|
33
|
+
@page.is_on_page? page_text
|
34
|
+
end
|
35
|
+
|
36
|
+
<%= I18n.translate( :then ).capitalize %>(/^<%= I18n.translate "steps.should_see_page_that_contains" %> '(.*?)'$/) do |page_text|
|
37
|
+
@page.is_on_page? page_text
|
38
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%= "# language: #{options[:lang]}" %>
|
2
|
+
<%= I18n.translate( :feature ) %>: <%= config[:name] %> <%= !config[:platform].empty? ? I18n.translate( "#{config[:platform].downcase}_only") : "" %>
|
3
|
+
|
4
|
+
<%= I18n.translate( :background ) %>:
|
5
|
+
# <%= I18n.translate( "comments.insert_steps" ) %>
|
6
|
+
|
7
|
+
<%= I18n.translate( :scenario ) %>: <%= I18n.translate( :first_scenario ) %>
|
8
|
+
# <%= I18n.translate( "comments.insert_steps" ) %>
|
@@ -1,13 +1,13 @@
|
|
1
|
-
class
|
1
|
+
class <%= config[:name] %>Screen < <%= config[:platform] %>ScreenBase
|
2
2
|
|
3
|
-
#
|
3
|
+
# <%= I18n.translate 'comments.trait' %>
|
4
4
|
#trait(:trait) { "* marked:'#{layout_name}'" }
|
5
5
|
|
6
|
-
#
|
6
|
+
# <%= I18n.translate 'comments.elements' %>
|
7
7
|
#element(:layout_name) {'insert_layout_identificator'}
|
8
8
|
#element(:button) {'insert_button_identificator'}
|
9
9
|
|
10
|
-
#
|
10
|
+
# <%= I18n.translate 'comments.actions' %>
|
11
11
|
# action(:touch_button) {
|
12
12
|
# touch("* marked:'#{button}'")
|
13
13
|
# }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cs-bdd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oscar Tanner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,48 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.19.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.19.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: i18n
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.6.11
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.6.11
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: gherkin
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.12.2
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.12.2
|
41
83
|
description: A simple gem to generate all the folder and files needed to create an
|
42
84
|
android and iOS calabash project.
|
43
85
|
email:
|
@@ -53,14 +95,12 @@ files:
|
|
53
95
|
- README.md
|
54
96
|
- Rakefile
|
55
97
|
- bin/cs-bdd
|
56
|
-
- bin/cs-bdd-generate.rb
|
57
98
|
- bin/cs-bdd-helpers.rb
|
58
99
|
- cs-bdd.gemspec
|
59
100
|
- lib/cs/bdd.rb
|
101
|
+
- lib/cs/bdd/locales/en.yml
|
102
|
+
- lib/cs/bdd/locales/pt.yml
|
60
103
|
- lib/cs/bdd/version.rb
|
61
|
-
- lib/examples/example.feature
|
62
|
-
- lib/examples/example_screen.rb
|
63
|
-
- lib/examples/example_steps.rb
|
64
104
|
- lib/skeleton/.gitignore
|
65
105
|
- lib/skeleton/README.md
|
66
106
|
- lib/skeleton/config/cucumber.yml
|
@@ -70,22 +110,20 @@ files:
|
|
70
110
|
- lib/skeleton/config/scripts/ios/run_tests_all_devices.sh
|
71
111
|
- lib/skeleton/features/android/android_screen_base.rb
|
72
112
|
- lib/skeleton/features/android/features/.gitkeep
|
73
|
-
- lib/skeleton/features/android/features/android.feature
|
74
|
-
- lib/skeleton/features/android/screens/example_screen.rb
|
75
113
|
- lib/skeleton/features/android/steps_definition/.gitkeep
|
76
114
|
- lib/skeleton/features/android/support/app_installation_hooks.rb
|
77
115
|
- lib/skeleton/features/android/support/app_life_cycle_hooks.rb
|
78
116
|
- lib/skeleton/features/android/support/hooks.rb
|
79
|
-
- lib/skeleton/features/example.feature
|
80
117
|
- lib/skeleton/features/ios/features/.gitkeep
|
81
|
-
- lib/skeleton/features/ios/features/ios.feature
|
82
118
|
- lib/skeleton/features/ios/ios_screen_base.rb
|
83
|
-
- lib/skeleton/features/ios/screens/example_screen.rb
|
84
119
|
- lib/skeleton/features/ios/steps_definition/.gitkeep
|
85
120
|
- lib/skeleton/features/ios/support/01_launch.rb
|
86
121
|
- lib/skeleton/features/ios/support/02_pre_stop_hooks.rb
|
87
|
-
- lib/skeleton/features/step_definitions/base_steps.rb
|
88
122
|
- lib/skeleton/features/support/env.rb
|
123
|
+
- lib/templates/base_steps.tt
|
124
|
+
- lib/templates/feature.tt
|
125
|
+
- lib/templates/screen.tt
|
126
|
+
- lib/templates/steps.tt
|
89
127
|
homepage: https://github.com/CSOscarTanner/cs-bdd
|
90
128
|
licenses:
|
91
129
|
- MIT
|
data/bin/cs-bdd-generate.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
class |Name|Screen < |Platform|ScreenBase
|
2
|
-
|
3
|
-
# The screen identificator
|
4
|
-
#trait(:trait) { "* marked:'#{layout_name}'" }
|
5
|
-
|
6
|
-
# Declare all the elements of this screen
|
7
|
-
#element(:layout_name) {'insert_layout_identificator'}
|
8
|
-
#element(:button) {'insert_button_identificator'}
|
9
|
-
|
10
|
-
# Declare all actions of this screen
|
11
|
-
# action(:touch_button) {
|
12
|
-
# touch("* marked:'#{button}'")
|
13
|
-
# }
|
14
|
-
|
15
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
Feature: Example Android
|
2
|
-
# This feature will only be executed when the android profile is loaded
|
3
|
-
# You can rename this file and update its contents or delete it and create new features
|
4
|
-
|
5
|
-
Background:
|
6
|
-
# Insert the steps
|
7
|
-
|
8
|
-
Scenario: First Scenario
|
9
|
-
# Insert the steps
|
@@ -1,9 +0,0 @@
|
|
1
|
-
Feature: Example iOS
|
2
|
-
# This feature will only be executed when the ios profile is loaded
|
3
|
-
# You can rename this file and update its contents or delete it and create new features
|
4
|
-
|
5
|
-
Background:
|
6
|
-
# Insert the steps
|
7
|
-
|
8
|
-
Scenario: First Scenario
|
9
|
-
# Insert the steps
|
File without changes
|
@@ -1,39 +0,0 @@
|
|
1
|
-
######### GIVEN #########
|
2
|
-
|
3
|
-
Given(/^I (?:drag|dragged) the screen (down|up|left|right) until I see the element "(.*?)"$/) do |direction, element|
|
4
|
-
@page.drag_until_element_is_visible_with_special_query direction.to_sym, element
|
5
|
-
end
|
6
|
-
|
7
|
-
Given(/^I am on a page that contains '(.*?)'$/) do |page_text|
|
8
|
-
@page.is_on_page? page_text
|
9
|
-
end
|
10
|
-
|
11
|
-
######### WHEN #########
|
12
|
-
|
13
|
-
When(/^I drag the screen (left|right|down|up) (\d+) times$/) do |direction, times|
|
14
|
-
@page.drag_for_specified_number_of_times(direction.to_sym, times.to_i)
|
15
|
-
end
|
16
|
-
|
17
|
-
When(/^I (?:touch|touched) the "(.*?)" element$/) do |element|
|
18
|
-
@page.touch_screen_element element
|
19
|
-
end
|
20
|
-
|
21
|
-
When(/^I drag the screen (down|up|left|right)$/) do |direction|
|
22
|
-
@page.drag_to direction.to_sym
|
23
|
-
end
|
24
|
-
|
25
|
-
######### THEN #########
|
26
|
-
|
27
|
-
Then(/^I (?:wait|waited) for the progress bar to vanish$/) do
|
28
|
-
# wait_for_progress is a method of the base class, so doesn't matter what is the value
|
29
|
-
# of the @page variable, because all screens will have this method
|
30
|
-
@page.wait_for_progress
|
31
|
-
end
|
32
|
-
|
33
|
-
Then(/^I should see the page '(.*?)'$/) do |page_text|
|
34
|
-
@page.is_on_page? page_text
|
35
|
-
end
|
36
|
-
|
37
|
-
Then(/^I should see a page that contains '(.*?)'$/) do |page_text|
|
38
|
-
@page.is_on_page? page_text
|
39
|
-
end
|