在 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 .
一些其他注意事项:
- 我无法像 mstest 那样将整个命令转换为一个字符串
期待多个参数。
- 我不能使用包含多个的测试列表
测试,因为这需要使用测试元数据文件和
解决方案不包含 vsmdi 文件。
只需生成 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"'
(使用原始前缀+简单引号以避免转义双引号)
我正在尝试为 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 .
一些其他注意事项:
- 我无法像 mstest 那样将整个命令转换为一个字符串 期待多个参数。
- 我不能使用包含多个的测试列表 测试,因为这需要使用测试元数据文件和 解决方案不包含 vsmdi 文件。
只需生成 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"'
(使用原始前缀+简单引号以避免转义双引号)