gpt4 book ai didi

python - 是否可以使用 python 装饰器将特定的单元测试定向到正在测试的不同实例?

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:48 25 4
gpt4 key购买 nike

我有一个包含 XML 字符串的类。这些是我的模型。

class ContainerForStringXMLs():
def __init__(self):
pass

@staticmethod
def get_model1(self):
return """I'm a long string called model1"""

@staticmethod
def get_model2(self):
return """I'm a long string called model2"""

我有一个基本测试类,它使我可以访问其他测试中的模型(以及其他一些在这里不重要的东西)

class BaseTest(unittest.TestCase):
def setUp(self, model='model1'):
self.model=model

if self.model == 'model1':
self.test_model = ContainerForStringXMLs.model1()
elif self.model == 'model2':
self.test_model = ContainerForStringXMLs.model2()

def tearDown(self):
del self.model
del self.test_model

我的实际测试类看起来像这样:

class TestClass(BaseTest):
def __init__(self):
pass

def test_on_model1(self):
"""
I want to perform this test on model1
"""
print self.test_model ##would return model 1

def test_on_model2(self):
"""
I want to perform this test on model 2
"""
print self.testmodel2

我想要执行的测试是完全相同的测试,但模型不同,因此我从 xml 中提取的值在每种情况下都会不同。我的问题是:是否有一种很好的 Pythonic 方法可以在 TestClass 的模型之间切换?我在想也许是一个装饰器或某种东西?

如果我能够使用类似以下内容来选择我将测试定向到哪个模型,那就太好了:

class TestClass(BaseTest):
def __init__(self):
pass

@testmodel1
def test_on_model1(self):
"""
I want to perform this test on model1
"""
print self.test_model ##would return model 1

@testmodel2
def test_on_model2(self):
"""
I want to perform this test on model 2
"""
print self.testmodel2

这种行为可能吗?

最佳答案

“XML strings”类按原样位于 models.py 中。测试助手(基类和装饰器)位于 testutils.py 中:

import unittest
import functools

import models


class BaseTestCase(unittest.TestCase):

def setUp(self, model='model1'):
self.model_loader = models.ContainerForStringXMLs
self.model = model

@property
def model_contents(self):
return getattr(
self.model_loader, 'get_' + self.model)(self.model_loader)


def use_model(model):
"""Make BaseTestCase-aware test use particular model."""
def _wrapper(func):
@functools.wraps(func)
def _inner(self):
orig = self.model
self.model = model
func(self)
self.model = orig
return _inner
return _wrapper

use_model 是一个采用模型名称 (model) 的装饰器,并且暂时设置测试方法的 self.model模型内容是一个从 ContainerForStringXMLs 获取 XML 字符串的属性对于当前的self.model

因为 get_model1get_model2 是采用 self 的静态方法(在您的示例中),在 model_contents 中,我传递 ContainerForStringXMLsclass as self (这不是特别好)。如果那不是的话你想要的,将 (self.model_loader) 更改为其他内容(并且,当然,更改 ContainerForStringXMLs 中的 get_* 方法以匹配你称呼他们的方式)。鉴于这是一个小问题,我只是假设只能修改测试和 BaseTest

test_models.py中有两个测试用例:

from testutils import BaseTestCase, use_model


class TwoModelsWithDefaultModelTest(BaseTestCase):

def setUp(self):
BaseTestCase.setUp(self, model='model2')

@use_model('model1')
def test_first_model(self):
self.assertEqual(self.model, 'model1')
self.assertEqual(
self.model_contents,
"I'm a long string called model1")

def test_second_model(self):
self.assertEqual(self.model, 'model2')
self.assertEqual(
self.model_contents,
"I'm a long string called model2")

@use_model('model1')
def test_first_model_again(self):
self.assertEqual(self.model, 'model1')
self.assertEqual(
self.model_contents,
"I'm a long string called model1")

def test_second_model_again(self):
self.assertEqual(self.model, 'model2')
self.assertEqual(
self.model_contents,
"I'm a long string called model2")


class TwoModelsTestWithoutExplicitSetUp(BaseTestCase):

@use_model('model1')
def test_first_model(self):
self.assertEqual(self.model, 'model1')
self.assertEqual(
self.model_contents,
"I'm a long string called model1")

@use_model('model2')
def test_second_model(self):
self.assertEqual(self.model, 'model2')
self.assertEqual(
self.model_contents,
"I'm a long string called model2")

def test_first_model_again(self):
self.assertEqual(self.model, 'model1')
self.assertEqual(
self.model_contents,
"I'm a long string called model1")

@use_model('model2')
def test_second_model_again(self):
self.assertEqual(self.model, 'model2')
self.assertEqual(
self.model_contents,
"I'm a long string called model2")

TwoModelsWithDefaultModelTest 调用 BaseTestCase.setUp对于不使用的测试,将 self.model 设置为 'model2'use_model 装饰器。 TwoModelsTestWithoutExplicitSetUp 使用BaseTestCase.setUp 的默认实现,无需更改model 参数默认,因此默认的 self.model'model1'

<小时/>

根据 print 语句判断,您使用的是 Python 2。您 should制作ContainerForStringXMLs 继承自 object

关于python - 是否可以使用 python 装饰器将特定的单元测试定向到正在测试的不同实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45492099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com