0

我有测试用 Python 编写的文件:test1.py test2.py... 在执行其中任何一个之前,我需要使用一个名为 initialize.py 的文件来初始化它们,该文件带有参数。

测试文件必须尽可能地轻巧且易于编写。

我想创建一个脚本:

  1. 接受输入参数
  2. 使用这些参数启动 initialize.py 文件
  3. 使用 initialize.py 创建的变量启动测试文件

我想了几个办法:

  • 导入这两个文件:它不起作用,因为通过导入,您可以在主脚本上使用 return 参数,但不能提供输入参数
  • 将两个文件转换为函数:initialize.py 不是问题,但正如我所说,我想让测试文件尽可能简单和轻便,所以如果我能避免它会更好。
  • 完美的解决方案是简单地从初始化中“复制”代码并将其放在测试文件的开头(或相反)。可能会创建一个包含两个代码的临时文件,但我认为它不是很干净。

总结一下:就好像我有 100 个以相同的 25 行开头的文件,我想将这 25 行放在一个文件中并每次都导入它们。

另一种查看事物的方式是 3 个文件:

#File1.py
var1 = sys.argv(1)

#File2.py
var2 = var1+"second"

#File3.py
var3 = var1+var2+"third"
print var3

我想先启动 ./File1.py 并得到“first second thrid”

我成功了

#! /usr/bin/python
import sys

import subprocess
source_content = "#! /usr/bin/python\n"+"import sys\n"

sourcefile = "file2.py"
txt_file = open(sourcefile)
source_content += txt_file.read()

sourcefile = "file3.py"
txt_file = open(sourcefile)
source_content += txt_file.read()

destinationfile = "Copyfile2.py"
target = open (destinationfile, 'w')
target.write(source_content)

target.close()

chmodFile = "chmod 777 "+destinationfile
chmod = subprocess.Popen(chmodFile, shell=True)
chmod.wait()
arguments = str("./"+destinationfile+" ")
arguments += " ".join(map(str,sys.argv[1:len(sys.argv)]))
startTest = subprocess.Popen(arguments, shell=True)
startTest.wait()

但我不得不从 test2 中删除“#!/usr/bin/python”,并在这些相同的文件上测试并将 var1 重命名为 sys.arg[1]。而且我认为这不是一个很好的解决方案...

4

1 回答 1

0

你如何使用 unittest 模块?

import unittest

class BaseTest(unittest.TestCase):
    def initialisation_script_stuff(blah,etc):
        foo

    def setUp(self):
        common_setup_stuff()

    def tearDown(self):
        whatever

现在您可以在每个测试文件中从 BaseTest 继承。

from moo import BaseTest

class CoolTest(BaseTest):
    def setUp(self):
        BaseTest.setUp(self)
        args = BaseTest.initialisation_script_stuff()
        do_stuff(args)

    def testNumberOne(self):
        self.assertEqual(1,1)

或者,如果您想远离标准的单元测试方法......

假设目录结构:

all_tests\
    __init__.py
    some_tests\
        __init__.py
        test1.py
        test2.py
    other _tests\
        __init__.py
        etc

一些命名约定:

  • 每个测试 py 文件都有一个名为run运行测试的函数
  • 每个测试 py 文件都有一个以“test”开头的名称
  • 每个测试分组文件夹的名称都以“_tests”结尾

制作一个名为 run_tests.py 的脚本(或类似的东西......)

def run_tests():
    import os
    import importlib
    import re
    dTests = {}
    lFolders = [s for s in os.listdir('all_tests') if re.match('.*_tests$',s)]
    for sFolder in lFolders:
        sFolderPath = os.path.join('all_tests',sFolder)
        lTestFileNames = [s for s in os.listdir(sFolderPath) if re.match('^test.*py$',s)]
        for sFileName in lTestFileNames:        
            sSubPath = '{0}.{1}'.format(sFolder,sFileName.split('.')[0])
            dTests[sSubPath] = importlib.import_module('all_tests.{0}'.format(sSubPath))
    #now you have all the tests...
    for k in dTests:
        stuff = initialisation_stuff()
        test_result = dTests[k].run(stuff)
        do_whatever_you_want(test_result)             

if __name__ == "__main__":
    run_tests()

现在,您的测试文件中绝对不需要样板代码。只要你遵循公式

于 2013-08-22T15:24:57.387 回答