Class: Actir::ParallelTests::Test::Result

Inherits:
Object
  • Object
show all
Defined in:
lib/actir/parallel_tests/test/result.rb

Class Method Summary collapse

Class Method Details

.any_test_failed?(result) ⇒ Boolean

判断是否有用例失败

Returns:

  • (Boolean)


161
162
163
# File 'lib/actir/parallel_tests/test/result.rb', line 161

def any_test_failed?(result)
  result[:exit_status] != 0
end

.error_tests_name_regObject

获取错误用例名的正则



166
167
168
# File 'lib/actir/parallel_tests/test/result.rb', line 166

def error_tests_name_reg
  /^Error:\s(test.+)\(.+\):/
end

.fail_tests_name_reg_extraObject

获取失败用例名的正则[补充场景]



176
177
178
# File 'lib/actir/parallel_tests/test/result.rb', line 176

def fail_tests_name_reg_extra
  /^(test.+)\(.+\)/
end

.failure_or_error_switch_offObject

测试用例执行报错信息截止正则



206
207
208
# File 'lib/actir/parallel_tests/test/result.rb', line 206

def failure_or_error_switch_off
  /^===============================================================================$/
end

.failure_or_error_switch_onObject

测试用例执行报错信息开头正则



201
202
203
# File 'lib/actir/parallel_tests/test/result.rb', line 201

def failure_or_error_switch_on
  /^Failure:|^Error:/
end

.failure_tests_file_regObject

获取失败用例文件名的正则



181
182
183
# File 'lib/actir/parallel_tests/test/result.rb', line 181

def failure_tests_file_reg
  /(.+\/test.+rb):\d+:in\s`.+'/
end

.failure_tests_file_reg_extraObject

获取失败用例文件名的正则[补充场景]



186
187
188
# File 'lib/actir/parallel_tests/test/result.rb', line 186

def failure_tests_file_reg_extra
  /^(test.+rb):\d+:in\s`.+'/
end

.failure_tests_name_regObject

获取失败用例名的正则



171
172
173
# File 'lib/actir/parallel_tests/test/result.rb', line 171

def failure_tests_name_reg
  /^Failure:\s(test.+)\(.+\)/
end

.file_suite_case_regObject

从执行结果中获取文件/测试套/测试用例的名称



156
157
158
# File 'lib/actir/parallel_tests/test/result.rb', line 156

def file_suite_case_reg
  /^Loaded\ssuite\s(.*)\nStarted\n\[suite start\]([^\.]*)\[suite end\]$/
end

.get_failed_testcaseObject

获取执行失败的用例



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/actir/parallel_tests/test/result.rb', line 29

def get_failed_testcase
  failed_case = []
  $testsuites.each do |testsuite|
    testcases = testsuite[:testcases] 
    testcases.each do |testcase|
      if testcase[:success] == false
        failed_case << testcase[:testcase_name]
      end
    end
  end
  failed_case
end

.get_run_test_info(test_result) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/actir/parallel_tests/test/result.rb', line 79

def get_run_test_info(test_result)
  output = test_result[:stdout]
  # output.scan(/^(\[suite start\])([^\.]*)(\[suite end\])$/).each do |suite|
  output.scan(file_suite_case_reg).each do |suite|
    filename = suite[0]
    testsuite = suite[1].scan(/^(suitname:\s*)([\d\w]*)/)[0][1]
    testsuite_name = get_unique_testname(filename, testsuite)
    cases = suite[1].scan(/^(testcase:\s*)([\d\w]*)/).inject([]) do |cases,testcase|
      testcase_name = get_unique_testname(filename, testcase[1])
      cases << {:testcase_name => testcase_name, :success => true, :detail => nil}
    end
    # 如果testsuites中已存在此用例的信息,说明这个用例执行了rerun,就不再次添加了
    is_case_exist = $testsuites.inject(false) do |is_case_exist, testsuite|
      if testsuite.has_value?(testsuite_name)
        is_case_exist = true
        break
      end
      is_case_exist
    end
    if(is_case_exist == false)
      testsuite = {:testsuite_name => testsuite_name, :testcases =>cases}
      $testsuites << testsuite
    end
  end
end

.get_testcase_from_unique(unique_testname) ⇒ Object



229
230
231
232
# File 'lib/actir/parallel_tests/test/result.rb', line 229

def get_testcase_from_unique(unique_testname)
  unique_testname =~ /(.*)\:(.*)/
  $2        
end

.get_testfailed_info(test_result) ⇒ Object

通过结果判断失败用例,获取失败用例的详细信息

将测试套和测试用例的详细信息写入全局变量$testsuites中



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/actir/parallel_tests/test/result.rb', line 110

def get_testfailed_info(test_result)
  result_array = test_result[:stdout].split("\n")
  failure_detail_hash = {}
  testfile = ""
  testcase = "" 
  detail = ""
  testcase_name = ""
  record_detail_switch = 0

  result_array.each do |result|
    record_detail_switch = 0 if result =~ failure_or_error_switch_off
    #遇到错误信息,开启记录错误信息开关
    record_detail_switch = 1 if result =~failure_or_error_switch_on

    # 记录报错信息
    if record_detail_switch == 1 
      detail += result + "\n"
    end

    # 记录报错用例名称
    if (result =~ failure_tests_name_reg) || (result =~ error_tests_name_reg) || (result =~ fail_tests_name_reg_extra)
      testcase = $1                
    end

    # 记录报错用例文件名称
    if (result =~ failure_tests_file_reg) || (result =~ failure_tests_file_reg_extra)
      #范例:"testcode/test_tt/test_hehe.rb:8:in `xxxx'"
      testfile = $1
    end

    # 合并用例名称和文件名称
    testcase_name = get_unique_testname(testfile, testcase)

    if testcase_name != "" && detail != "" && record_detail_switch == 0
      failure_detail_hash[testcase_name] = detail
      testcase = ""
      testfile = ""
      detail = ""
      testcase_name = ""
    end
  end

  failure_detail_hash
end

.get_testfile_from_unique(unique_testname) ⇒ Object



224
225
226
227
# File 'lib/actir/parallel_tests/test/result.rb', line 224

def get_testfile_from_unique(unique_testname)
  unique_testname =~ /(.*)\:(.*)/
  $1       
end

.get_testsuite_detail(test_result, mode = :runner) ⇒ Object

通过结果判断测试套的详细信息

将测试套和测试用例的详细信息写入全局变量$testsuites中



13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/actir/parallel_tests/test/result.rb', line 13

def get_testsuite_detail(test_result, mode = :runner)
  $testsuites = [] unless $testsuites
  if mode == :runner
    get_run_test_info(test_result)
    #如果有用例失败,则记录详细信息,否则不需要
    if any_test_failed?(test_result)
      record_detail(test_result)
    end
  else
    record_detail(test_result)
  end
end

.get_unique_testname(testfile, test) ⇒ Object

因为测试用例名称/测试套名称有可能重复,所以采用 测试文件名称:测试用例名称 的方式作为测试用例名称的唯一标识 也可用于测试套名称组合



212
213
214
215
216
217
218
219
220
221
222
# File 'lib/actir/parallel_tests/test/result.rb', line 212

def get_unique_testname(testfile, test)
  if (test != "" || test != nil) && (testfile != "" || testfile != nil)
    # 判断测试文件名称是否包含.rb后缀,如果没有则加上
    unless testfile =~ /.*\.rb$/
      testfile += ".rb"
    end
    return testfile + ":" + test 
  else
    return ""
  end
end

.record_detail(test_result) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/actir/parallel_tests/test/result.rb', line 42

def record_detail(test_result)
  failure_detail_hash = get_testfailed_info(test_result)
  
  $testsuites.each do |testsuite|
    testcases = testsuite[:testcases] 
    testcases.each do |testcase|
      #标识用例是否执行失败
      fail_flag = 0
      failure_detail_hash.each do |testcase_failure, detail|
        if testcase_failure == testcase[:testcase_name]
          testcase[:success] = false
          testcase[:detail] = detail 
          fail_flag = 1
          #从hash表中移除 
          failure_detail_hash.delete(testcase_failure)
        end
      end
      if fail_flag == 0
        testcase[:success] = true
        testcase[:detail] = nil
      end
    end
  end
  # 反向再检查一遍是否有$testsuites种未记录的失败用例
  miss_failed_case = []
  if failure_detail_hash.size > 0
    failure_detail_hash.each do |testcase_failure, detail|
      testcase = {:testcase_name => testcase_failure, :success => false, :detail => detail}
      #从hash表中移除 
      failure_detail_hash.delete(testcase_failure)
      miss_failed_case << testcase
    end
    testsuite = {:testsuite_name => "miss_failed_case", :testcases => miss_failed_case}
    $testsuites << testsuite
  end
end

.test_info_swtich_offObject

测试套信息截止正则



196
197
198
# File 'lib/actir/parallel_tests/test/result.rb', line 196

def test_info_swtich_off
  /^\[suite end\]/
end

.test_info_swtich_onObject

测试套信息开头正则



191
192
193
# File 'lib/actir/parallel_tests/test/result.rb', line 191

def test_info_swtich_on
  /^\[suite start\]/
end