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)


148
149
150
# File 'lib/actir/parallel_tests/test/result.rb', line 148

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

.error_tests_name_regObject

获取错误用例名的正则



153
154
155
# File 'lib/actir/parallel_tests/test/result.rb', line 153

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

.fail_tests_name_reg_extraObject

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



163
164
165
# File 'lib/actir/parallel_tests/test/result.rb', line 163

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

.failure_or_error_switch_offObject

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



193
194
195
# File 'lib/actir/parallel_tests/test/result.rb', line 193

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

.failure_or_error_switch_onObject

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



188
189
190
# File 'lib/actir/parallel_tests/test/result.rb', line 188

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

.failure_tests_file_regObject

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



168
169
170
# File 'lib/actir/parallel_tests/test/result.rb', line 168

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

.failure_tests_file_reg_extraObject

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



173
174
175
# File 'lib/actir/parallel_tests/test/result.rb', line 173

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

.failure_tests_name_regObject

获取失败用例名的正则



158
159
160
# File 'lib/actir/parallel_tests/test/result.rb', line 158

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

.file_suite_case_regObject

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



143
144
145
# File 'lib/actir/parallel_tests/test/result.rb', line 143

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



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/actir/parallel_tests/test/result.rb', line 66

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



216
217
218
219
# File 'lib/actir/parallel_tests/test/result.rb', line 216

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

.get_testfailed_info(test_result) ⇒ Object

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

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



97
98
99
100
101
102
103
104
105
106
107
108
109
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
# File 'lib/actir/parallel_tests/test/result.rb', line 97

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



211
212
213
214
# File 'lib/actir/parallel_tests/test/result.rb', line 211

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

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



199
200
201
202
203
204
205
206
207
208
209
# File 'lib/actir/parallel_tests/test/result.rb', line 199

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
# 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
end

.test_info_swtich_offObject

测试套信息截止正则



183
184
185
# File 'lib/actir/parallel_tests/test/result.rb', line 183

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

.test_info_swtich_onObject

测试套信息开头正则



178
179
180
# File 'lib/actir/parallel_tests/test/result.rb', line 178

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