Python 无样板试验

Python 无样板试验,python,import,Python,Import,我有Python中的wirtten测试文件:test1.py test2.py。。。 在执行它们之前,我需要用一个名为initialize.py的文件初始化它们,该文件接受参数 测试文件必须尽可能轻巧和易于编写 我想创建一个脚本,用于: 接受输入参数 用这些参数启动initialize.py文件 使用initialize.py创建的变量启动测试文件 我想了几个办法: 导入这两个文件:它不起作用,因为使用Import可以在主脚本上使用return参数,但不能提供input参数 将这两个文件转换为

我有Python中的wirtten测试文件:test1.py test2.py。。。 在执行它们之前,我需要用一个名为initialize.py的文件初始化它们,该文件接受参数

测试文件必须尽可能轻巧和易于编写

我想创建一个脚本,用于:

  • 接受输入参数
  • 用这些参数启动initialize.py文件
  • 使用initialize.py创建的变量启动测试文件
  • 我想了几个办法:

    • 导入这两个文件:它不起作用,因为使用Import可以在主脚本上使用return参数,但不能提供input参数
    • 将这两个文件转换为函数:initialize.py没有问题,但正如我所说的,我希望测试文件尽可能简单和轻巧,这样如果我可以避免的话,它会更好
    • 完美的解决方案是简单地从initialize中“复制”代码,并将其放入测试文件的beging中(或相反)。可能需要创建一个包含这两个代码的临时文件,但我认为它不是很干净
    总而言之:这就好像我有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 并得到“第一秒第三”

    我成功了

    #! /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”结尾的名称
    制作一个名为run_tests.py的脚本(或类似的东西…)


    现在,您的测试文件中绝对不需要锅炉板代码。只要你遵循这个公式,这是一个很好的解决方案,但是在每个测试文件上仍然有很多东西要写。它是测试文件这一事实并不重要。就好像我有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()