【问题标题】:Writing Python test classes using Nose and Sqlalchemy with fixtures使用带有夹具的 Nose 和 Sqlalchemy 编写 Python 测试类
【发布时间】:2014-09-17 14:58:21
【问题描述】:

我今天一直在用鼻子和固定装置打架,不禁觉得我做错了什么。

我将所有测试都写成函数,一切正常,但我想将它们移动到测试类,因为我认为它更整洁,然后可以继承测试。

我创建了一个与 testdb 的连接、要使用的事务以及用于所有测试的包级别的一些固定装置。应用程序中的存储库类使用此连接从数据库加载测试数据。

我尝试使用他们要测试的类作为属性来创建我的测试类。这是在测试类的__init__ 函数中设置的。

我遇到的问题是我正在测试的类需要使用我的测试数据库中的数据进行实例化,但是 Nose 在运行包设置函数之前创建了一个测试类的实例。这意味着在创建测试类并且测试失败时没有固定装置。

我可以让它工作的唯一方法是添加一个模块设置函数,该函数将我要测试的类定义为全局,然后在测试方法中使用该全局,但这似乎很hacky。任何人都可以提出更好的方法吗?

这不是很清楚,所以这里是我的测试模块的一个例子......

from nose.tools import *
from myproject import repositories
from myproject import MyClass

def setup():
    global class_to_test

    db_data_repo = repositories.DBDataRepository()
    db_data = db_data_repo.find(1)

    class_to_test = MyClass(db_data)


class TestMyClass(object):

    def test_result_should_be_an_float(self):
        result = class_to_test.do_something()

        assert isinstance(result, float)

如果您知道实现此目的的更好方法,请分享:) 谢谢!

【问题讨论】:

    标签: python unit-testing fixtures nose


    【解决方案1】:

    如果您正在转向基于unittest.TestCase 类的测试,您不妨使用将在每个测试方法之前运行的setUp()/tearDown() 方法,并使用setUpClass() 设置特定于类的东西,nose 会像处理它一样处理它unittest 将是这样的:

    class TestMyClass(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            db_data_repo = repositories.DBDataRepository()
            db_data = db_data_repo.find(1)
            cls.class_to_test = MyClass(db_data)    
    
        def test_result_should_be_an_float(self):
            result = self.class_to_test.do_something()
            assert isinstance(result, float)
    

    【讨论】:

    • 谢谢,看起来好多了。使用Nose时扩展unittest.TestCase有什么坏处吗?
    • 我只能看到测试运行程序独立性的附带好处。所有测试运行器都将支持原生单元测试。
    猜你喜欢
    • 2020-06-27
    • 2011-04-16
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2021-09-20
    • 2013-06-18
    相关资源
    最近更新 更多