在python中动态创建变量,并将它们作为参数在子流程中使用

2024-10-05 14:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为mstest创建一些参数。你知道吗

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

我创建了一个python脚本,它通过mstest运行CodedUI自动化测试用例。你知道吗

步骤1:调用如下子流程:

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"

第3步:然后我尝试用这个子流程调用.. 你知道吗

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

失败的原因是/测试: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]

那么,如何动态生成多个arg呢?因为在一次运行中,我可能只有一个测试失败,但在另一次运行中,我可能有4个或5个arg,然后将它们插入到子流程调用. 你知道吗

其他注意事项:

  • 我不能像mstest那样将整个命令转换成一个字符串 需要多个参数。你知道吗
  • 我不能使用包含多个 测试,因为这需要使用测试元数据文件和 解决方案不包含vsmdi文件。你知道吗

Tags: testsettingscontainerargexeresultslisttest1
1条回答
网友
1楼 · 发布于 2024-10-05 14:26:58

只需生成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"'

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

相关问题 更多 >