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)


105
106
107
# File 'lib/actir/parallel_tests/test/result.rb', line 105

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

.error_tests_name_regObject

获取错误用例名的正则



110
111
112
# File 'lib/actir/parallel_tests/test/result.rb', line 110

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

.failure_or_error_switch_offObject



131
132
133
# File 'lib/actir/parallel_tests/test/result.rb', line 131

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

.failure_or_error_switch_onObject



127
128
129
# File 'lib/actir/parallel_tests/test/result.rb', line 127

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

.failure_tests_name_regObject

获取失败用例名的正则



115
116
117
# File 'lib/actir/parallel_tests/test/result.rb', line 115

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

.get_run_test_info(test_result) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/actir/parallel_tests/test/result.rb', line 45

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

.get_testfailed_detail(test_result) ⇒ Object

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

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



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/actir/parallel_tests/test/result.rb', line 72

def get_testfailed_detail(test_result)
  result_array = test_result[:stdout].split("\n")
  failure_detail_hash = {}
  testcase = "" 
  detail = ""
  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)
      testcase = $1
    end

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

  failure_detail_hash
end

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

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

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



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 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)
  end
  
  #如果有用例失败,则记录详细信息,否则不需要
  if any_test_failed?(test_result)
    failure_detail_hash = get_testfailed_detail(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
end

.test_info_swtich_offObject



123
124
125
# File 'lib/actir/parallel_tests/test/result.rb', line 123

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

.test_info_swtich_onObject



119
120
121
# File 'lib/actir/parallel_tests/test/result.rb', line 119

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