首页 > 技术文章 > Mac下的UI自动化测试 (四)

liupengblog 2015-07-16 12:43 原文

在实际写testcase的时候会使用unittest框架,但是在sikuli中需要使用它提供的command来运行,位于/Applications/SikuliX.app/run,使用-r参数指定要运行的sikuli文件,然后再使用 --args参数将想传给这个sikuli文件的参数附在后面:

sudo /Applications/SikuliX.app/run -r testcases/runner_html.sikuli --args report:[test report file, a html file] cases:[case id list] build:[build_id]

而且为了能直接输出html的测试报告,使用了HTMLTestRunner来运行一个testsuite,具体代码如下:

 

 1 import sys
 2 import os
 3 import re
 4 import unittest
 5 
 6 lib = os.path.join(os.path.expanduser("~"), "mac_auto")
 7 if lib not in sys.path:
 8     sys.path.append(lib)
 9 
10 from global_config import *
11 
12 if path_of_site_packages not in sys.path:
13     sys.path.append(path_of_site_packages)
14 
15 from htmloutput.html_test_runner import HTMLTestRunner
16 
17 report_file = None
18 test_case_ids = None
19 build = None
20 for arg in sys.argv[1:]:
21     if arg.startswith("report:"):
22         report_file = arg.split(":")[1]
23         print "test result file is " + report_file
24     if arg.startswith("cases:"):
25         test_case_ids = arg.split(":")[1].split(",")
26     if arg.startswith("build:"):
27         build = arg.split(":")[1]
28 
29 # It'll load all test caes in current folder if no test case indicated
30 if test_case_ids is None or len(test_case_ids) == 0:
31     print "Loading all test cases in current folder"
32     test_case_module_names = [re.sub("\.sikuli$", "", i) for i in os.listdir(
33         os.path.join(test_home_path, "testcases")) if i.startswith("test_case")]
34 else:
35     test_case_module_names = ["test_case_{0}".format(i) for i in test_case_ids]
36 
37 test_case_modules = []
38 for i in test_case_module_names:
39     print "Importing module " + i
40     test_case_modules.append(__import__(i, globals(), locals(), [], -1))
41 
42 suite = None
43 if len(test_case_modules) >= 1:
44     suite = unittest.TestLoader().loadTestsFromModule(test_case_modules[0])
45 for m in test_case_modules[1:]:
46     suite.addTests(unittest.TestLoader().loadTestsFromModule(m))
47 
48 outfile = open(report_file, "w")
49 runner = HTMLTestRunner(stream=outfile, verbosity=2, title='OSX Test Report', build=build)
50 
51 print "Start running test"
52 runner.run(suite)

上面的代码将搜索testcases目录下以test_case开头的sikuli文件,将其动态导入到testloader中运行。

另外也对HTMLTestRunner做了一下改变,让其能输出指定的build信息。

在命令行中输入如下命令,将运行所有testcases目录下得测试用例,并输出结果到test_result.html:

sudo /Applications/SikuliX.app/run -r testcases/runner_html.sikuli --args report:test_result.html build:your_build_id

输出的html显示如下信息:

 

python有个优秀的测试工具叫nose,它扩展了unittest的功能,使得其更加易用,我们也可以在sikuli写成的testcase上使用nose的标签标记我们的testmethod,然后使用nose.core.run来在sikuli文件运行测试,代码如下:

 1 import sys
 2 import os
 3 
 4 lib = os.path.join(os.path.expanduser("~"), "mac_auto")
 5 if lib not in sys.path:
 6     sys.path.append(lib)
 7 import global_config
 8 
 9 if global_config.path_of_site_packages not in sys.path:
10     sys.path.append(global_config.path_of_site_packages)
11 import nose
12 from htmloutput.html_for_nose import HtmlOutput
13 
14 build = None
15 for arg in sys.argv[1:]:
16     if arg.startswith("--build="):
17         build = arg.split("=")[1]
18         sys.argv.remove(arg)
19 
20 args = sys.argv[1:]
21 print args
22 
23 nose.core.run(argv=args, addplugins=[HtmlOutput(title='OSX Test Report', build=build)])

默认nose输出的是一个xunit的testresult,可以方便的在jenkins上解析出来。这里我加了一个nose的plugin,使其可以输出html的测试结果,使用的是一个对HTMLTestRunner.py的修改版本,位于github的这里:

https://github.com/openstack-infra/nose-html-output/blob/master/htmloutput/htmloutput.py

 

将上面的代码存为一个sikuli文件,命名为runner_nose.sikuli,然后使用下面的命令运行标记为BVT的所有测试:

sudo /Applications/SikuliX.app/run -r testcases/runner_nose.sikuli --args -v --with-xunit --xunit-file=result.xml --attr=BVT --build=your_build_id

 

上输出的是一个xunit的测试结果,也可以使用下面的命令输出一个html的结果:

sudo /Applications/SikuliX.app/run -r testcases/runner_nose.sikuli --args -v --with-html-output --html-out-file=result.html --attr=BVT --build=your_build_id

 

推荐阅读