Тестирование Python: добавление методов тестирования динамически? - PullRequest
0 голосов
/ 14 декабря 2018

Мои модульные тесты сложны, и их нелегко (или невозможно) программировать вручную вручную.Было бы полезно иметь возможность динамически добавлять тестовые данные и, для удобства чтения, иметь собственный метод тестирования для каждого из них, предпочтительно путем генерации тестовых методов на лету.

Вот (нерабочий) пример:

class TestParam(unittest.TestCase):
    def __init__(self, _):
        dir = 'test_param_items'
        for f in os.listdir(dir):
            if os.path.isfile(dir + "\\" + f) and f[0] != '_':
                print f
                func = self.TestCaseFactory(f, dir)
                setattr(TestParam, func.__name__, func)
                super(TestParam, self).__init__(func.__name__)


    def TestCaseFactory(self, inFileName, inDir):
        def func(inObj):
            print inFileName
            with open(inDir + "\\" + inFileName, "r") as testFile:
                testNode = testFile.read()
                par = Param(inETree=etree.XML(testNode))
                self.assertEqual(testNode, etree.tostring(par.eTree))
        func.__name__ = "test_" + inFileName[:-4]
        return func

И тестовые файлы здесь представляют собой обычные XML-файлы.Но исполнитель тестов Python 2.7 берет методы тестирования из класса, а не из экземпляра, и запускает их по экземпляру:

loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))

, поэтому я не могу запустить сгенерированные тестовые функции.Моя ошибка, очевидно, в том, что обычно тестовый метод охватывает много тестовых случаев, но я думаю, что написание 10 или 100 этих методов занимает очень много времени.И было бы довольно грязно иметь кучу тестов для каждого метода, и когда тест (метод) не может найти фактический вывод метода AssertEquals с огромными данными.И я бы нашел подход

def testMethod1(self):
    load('testFile1')

def testMethod2(self):
    load('testFile2')

и т. Д.довольно много разложено (данные испытаний и методы испытаний разделены на разные файлы).

Есть идеи по этому поводу?Мой подход неверен?Есть ли возможность сделать это?

Есть идеи такого подхода?

1 Ответ

0 голосов
/ 17 декабря 2018

Наконец мне удалось решить эту проблему исключительно на основе инфраструктуры Python 2.7, вызвав TestSuites:

#modules of the tested objects not included here
from TemplateMaker import Param
from lxml import etree
#/

import unittest
import os
import os.path


class TestSuiteParam(unittest.TestSuite):
    def __init__(self):
        self._tests = []
        dir = 'test_param_items'
        for f in os.listdir(dir):
            if os.path.isfile(dir + "\\" + f) and f[0] != '_':
                # "_test_filename" is for inactive/switched off tests 
                tp = TestParam(f, dir)
                self.addTest(tp)
        super(TestSuiteParam, self).__init__(self._tests)


class TestParam(unittest.TestCase):
    def __init__(self, inFile, inDir):
        func = self.TestCaseFactory(inFile, inDir)
        setattr(TestParam, func.__name__, func)
        super(TestParam, self).__init__(func.__name__)

    @staticmethod
    def TestCaseFactory(inFileName, inDir):
        def func(inObj):
            with open(inDir + "\\" + inFileName, "r") as testFile:
                testNode = testFile.read()
                par = Param(inETree=etree.XML(testNode))
                inObj.assertEqual(testNode, etree.tostring(par.eTree))
        func.__name__ = "test_" + inFileName[:-4]
        return func

Обратите внимание, что это решение все еще не идеально (по какой-то причине экземпляр TestCase может иметьтолько один метод тестирования, так как init () его родителя обрабатывает только один), но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...