在扩展测试时执行 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结果。