在python中动态创建变量并在子进程中将它们用作args

时间:2018-01-12 14:59:06

标签: python mstest coded-ui-tests

我正在尝试为mstest创建一些args。

基本上我运行所有自动化测试并解析trx结果文件以获取所有失败的测试并使用它来重新运行所有失败的测试。

我已经创建了一个python脚本,它通过mstest运行我们的CodedUI GUI自动化测试用例。

Step1:调用这样的子流程:

test_exe = "C:\VS14\Common7\IDE\mstest.exe"
test_container = "/testcontainer:\"C:\GUIAutomation\CodedUIGUIAutomation.dll\""
test_settings = "/testsettings:\"C:\GUIAutomation\CodedUI.testsettings\""
test_results = "/results:\"C:\GUIAutomation\results_automated.trx\""

p = subprocess.call([test_exe, test_container, test_settings, test_category, test_results])

MSTEST Run Command_1: C:\VS14\Common7\IDE\mstest.exe /testcontainer:"C:\GUIAutomation\CodedUIGUIAutomation.dll /testsettings:"C:\GUIAutomation\CodedUI.testsettings" /category:Automated /resultsfile:C:\GUIAutomation\results_automated.trx

第2步:解析trx结果文件以获取我附加到列表中重新运行的失败测试列表

fails_list.append(result.attrib['test1']
fails_list.append(result.attrib['test2']
fails_list.append(result.attrib['test3']

for x in fails_list:
    test_list = test_list + "/test:{0} ".format(str(x))

test_list output: "/test:test1 /test:test2 /test:test3"

Step3:然后我尝试重新运行此subprocess.call ..

test_results = "/results:\"C:\GUIAutomation\results_automated_rerun.trx\""

p = subprocess.call([test_exe, test_container, test_settings, test_list, test_results])
MSTEST Run Command_1: C:\VS14\Common7\IDE\mstest.exe /testcontainer:"C:\GUIAutomation\CodedUIGUIAutomation.dll /testsettings:"C:\GUIAutomation\CodedUI.testsettings" /test:test1 /test:test2 /test:test3 /resultsfile:C:\GUIAutomation\results_automated_rerun.trx

这会失败,因为/ test:test1 / test:test2被视为一个arg,但如果我剪切并将其粘贴到命令提示符下,它就可以正常工作。

因此,测试列表应该是子进程的单独args。而不是

test_list = "/test:test1 /test:test2 /test:test3"
p = subprocess.call([test_exe, test_container, test_settings, test_list, test_results]

应该是

arg_1 = "/test:test1"
arg_2 = "/test:test2" 
arg_3 = "/test:test3"
p = subprocess.call([test_exe, test_container, test_settings, arg_1, arg_2, arg_3, test_results]

那么我如何动态生成多个args,因为在一次运行中我可能只有一次测试失败,但在另一次运行中我可以有4或5然后将它们插入subprocess.call。

其他一些说明:

  • 我无法将整个命令转换为mstest的一个字符串 期待多个args。
  • 我无法使用包含多个的测试列表 测试因为这需要使用测试元数据文件和 解决方案不包含vsmdi文件。

1 个答案:

答案 0 :(得分:0)

只需生成test_list作为参数列表:

test_list = ["/test:{}".format(str(x)) for x in fails_list]

然后撰写你的参数列表

p = subprocess.call([test_exe, test_container, test_settings] + test_list + [test_results])

请注意

test_results = "/results:\"C:\GUIAutomation\results_automated_rerun.trx\""

错误,因为路径包含\r:解析为回车符。应该是(如果确实需要报价,否则放弃它们):

test_results = r'/results:"C:\GUIAutomation\results_automated_rerun.trx"'

(使用原始前缀+简单引号以避免转义双引号)