Python 无样板试验
我有Python中的wirtten测试文件:test1.py test2.py。。。 在执行它们之前,我需要用一个名为initialize.py的文件初始化它们,该文件接受参数 测试文件必须尽可能轻巧和易于编写 我想创建一个脚本,用于:Python 无样板试验,python,import,Python,Import,我有Python中的wirtten测试文件:test1.py test2.py。。。 在执行它们之前,我需要用一个名为initialize.py的文件初始化它们,该文件接受参数 测试文件必须尽可能轻巧和易于编写 我想创建一个脚本,用于: 接受输入参数 用这些参数启动initialize.py文件 使用initialize.py创建的变量启动测试文件 我想了几个办法: 导入这两个文件:它不起作用,因为使用Import可以在主脚本上使用return参数,但不能提供input参数 将这两个文件转换为
- 导入这两个文件:它不起作用,因为使用Import可以在主脚本上使用return参数,但不能提供input参数
- 将这两个文件转换为函数:initialize.py没有问题,但正如我所说的,我希望测试文件尽可能简单和轻巧,这样如果我可以避免的话,它会更好
- 完美的解决方案是简单地从initialize中“复制”代码,并将其放入测试文件的beging中(或相反)。可能需要创建一个包含这两个代码的临时文件,但我认为它不是很干净
#File1.py
var1 = sys.argv(1)
#File2.py
var2 = var1+"second"
#File3.py
var3 = var1+var2+"third"
print var3
我想先开始./File1.py
并得到“第一秒第三”
我成功了
#! /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]。
我认为这不是一个好的解决方案…您使用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”开头的名称
- 每个测试分组文件夹都有一个以“\u tests”结尾的名称
现在,您的测试文件中绝对不需要锅炉板代码。只要你遵循这个公式,这是一个很好的解决方案,但是在每个测试文件上仍然有很多东西要写。它是测试文件这一事实并不重要。就好像我有100个文件以相同的25行开头,我想把这25行放在一个文件中,每次导入它们。@user2707890:显然还有更多的内容。。。因此,您有一堆测试文件(test1.py、test2.py等)和一个所有测试通用的初始化器函数。这里是模糊的部分:你如何分组你的测试?每个测试文件一个?您计划如何运行测试?同时使用相同的初始化器函数参数?在每个测试或每个测试文件的基础上指定初始化器参数时,是否同时使用所有初始化器参数?一次一个?测试分组在文件夹中,但我希望能够逐个或按文件夹运行它们。因此我愿意创建两个脚本,但我认为如果我可以创建第一个脚本(一次一个测试),我可以轻松创建另一个脚本,因此我将重点放在这一点上。是的,每个文件一次测试。(一个测试文件大约有150行)对于“完整测试”,所有测试的参数都是相同的。为什么我的问题的名称改为“无模板测试”…?以前是什么?也许这更准确?根据事物的内容来命名是件好事。有时更好的标题会随着需求而出现,模糊的标题对任何人都没有帮助
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()