在扩展测试时执行 python 子进程 class
Executing python subprocess while extending the test class
我正在尝试找出在远程虚拟机上 运行 一个 python 子进程的最佳方法,同时该子进程被包装在一个测试框架中
#!/usr/bin/python3
import unittest, subprocess
from utils.framework.baseTest import BaseTest
class BriansTest(BaseTest):
def test_briansTest(self):
subprocess.call(['ls -la', '-1'], shell=True)
if __name__ == '__main__':
unittest.main()
但是当我们 运行 将整个脚本发送到 vm 并执行时,但显然 VM 对 BaseTest 一无所知,因为它在 testRunner (运行deck)
我们想要一个解决方案,它可以只向 VM 发送命令,而不必发送整个脚本和 returns 所需的输出,这样我们就可以在测试中断言它 class。
根据设计,内联脚本和“外部”脚本总是暗示远程节点上的脚本副本,也许“肮脏”的解决方法是将特定目录与您的 classes 一起使用并在您的节点定义复制调用 class 作为复制目录的脚本(这样从 Rundeck 服务器复制到远程服务器的脚本只包含调用)。
resources.xml
定义(使用 file-copy-destination-dir
属性作为用于复制文件的“库位置”):
<?xml version="1.0" encoding="UTF-8"?>
<project>
<node name="node00" description="Node 00" tags="user" hostname="192.168.33.20" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-1062.4.1.el7.x86_64" username="vagrant" ssh-key-storage-path="keys/rundeck" file-copy-destination-dir="/mylib/"/>
</project>
在该目录中,我留下了主要代码(class在你的情况下),module.py
,你可以将该目录安全化以避免被其他帐户读取。
def greeting(name):
print("Hello, " + name)
所以,这意味着执行该模块的代码是唯一从 Rundeck 实例复制的代码:
import module
module.greeting("Brian")
这里是完整的作业定义(我使用了内联脚本):
<joblist>
<job>
<defaultTab>nodes</defaultTab>
<description></description>
<dispatch>
<excludePrecedence>true</excludePrecedence>
<keepgoing>false</keepgoing>
<rankOrder>ascending</rankOrder>
<successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
<threadcount>1</threadcount>
</dispatch>
<executionEnabled>true</executionEnabled>
<id>4edefa30-8fb7-4b74-b8d6-a86f68625e12</id>
<loglevel>INFO</loglevel>
<name>HelloWorld</name>
<nodeFilterEditable>false</nodeFilterEditable>
<nodefilters>
<filter>name: node00</filter>
</nodefilters>
<nodesSelectedByDefault>true</nodesSelectedByDefault>
<plugins />
<scheduleEnabled>true</scheduleEnabled>
<sequence keepgoing='false' strategy='node-first'>
<command>
<fileExtension>.py</fileExtension>
<script><![CDATA[import module
module.greeting("Brian")]]></script>
<scriptargs />
<scriptinterpreter>/usr/bin/python2</scriptinterpreter>
</command>
</sequence>
<uuid>4edefa30-8fb7-4b74-b8d6-a86f68625e12</uuid>
</job>
</joblist>
和here结果。
我正在尝试找出在远程虚拟机上 运行 一个 python 子进程的最佳方法,同时该子进程被包装在一个测试框架中
#!/usr/bin/python3
import unittest, subprocess
from utils.framework.baseTest import BaseTest
class BriansTest(BaseTest):
def test_briansTest(self):
subprocess.call(['ls -la', '-1'], shell=True)
if __name__ == '__main__':
unittest.main()
但是当我们 运行 将整个脚本发送到 vm 并执行时,但显然 VM 对 BaseTest 一无所知,因为它在 testRunner (运行deck)
我们想要一个解决方案,它可以只向 VM 发送命令,而不必发送整个脚本和 returns 所需的输出,这样我们就可以在测试中断言它 class。
根据设计,内联脚本和“外部”脚本总是暗示远程节点上的脚本副本,也许“肮脏”的解决方法是将特定目录与您的 classes 一起使用并在您的节点定义复制调用 class 作为复制目录的脚本(这样从 Rundeck 服务器复制到远程服务器的脚本只包含调用)。
resources.xml
定义(使用 file-copy-destination-dir
属性作为用于复制文件的“库位置”):
<?xml version="1.0" encoding="UTF-8"?>
<project>
<node name="node00" description="Node 00" tags="user" hostname="192.168.33.20" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-1062.4.1.el7.x86_64" username="vagrant" ssh-key-storage-path="keys/rundeck" file-copy-destination-dir="/mylib/"/>
</project>
在该目录中,我留下了主要代码(class在你的情况下),module.py
,你可以将该目录安全化以避免被其他帐户读取。
def greeting(name):
print("Hello, " + name)
所以,这意味着执行该模块的代码是唯一从 Rundeck 实例复制的代码:
import module
module.greeting("Brian")
这里是完整的作业定义(我使用了内联脚本):
<joblist>
<job>
<defaultTab>nodes</defaultTab>
<description></description>
<dispatch>
<excludePrecedence>true</excludePrecedence>
<keepgoing>false</keepgoing>
<rankOrder>ascending</rankOrder>
<successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
<threadcount>1</threadcount>
</dispatch>
<executionEnabled>true</executionEnabled>
<id>4edefa30-8fb7-4b74-b8d6-a86f68625e12</id>
<loglevel>INFO</loglevel>
<name>HelloWorld</name>
<nodeFilterEditable>false</nodeFilterEditable>
<nodefilters>
<filter>name: node00</filter>
</nodefilters>
<nodesSelectedByDefault>true</nodesSelectedByDefault>
<plugins />
<scheduleEnabled>true</scheduleEnabled>
<sequence keepgoing='false' strategy='node-first'>
<command>
<fileExtension>.py</fileExtension>
<script><![CDATA[import module
module.greeting("Brian")]]></script>
<scriptargs />
<scriptinterpreter>/usr/bin/python2</scriptinterpreter>
</command>
</sequence>
<uuid>4edefa30-8fb7-4b74-b8d6-a86f68625e12</uuid>
</job>
</joblist>
和here结果。