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

create variables dynamically in python and use them within subprocess as args

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

基本上我运行 我们所有的自动化测试并解析 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,但如果我将其剪切并粘贴到命令提示符中,它会完美运行。

所以测试列表应该是子进程的单独参数。所以而不是

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 .

一些其他注意事项:

只需生成 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:被解析为回车return。应该是(如果确实需要引号,否则将其删除):

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

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