在实际写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