使用Nose和Sqlalchemy以及fixture编写Python测试类

使用Nose和Sqlalchemy以及fixture编写Python测试类,python,unit-testing,fixtures,nose,Python,Unit Testing,Fixtures,Nose,我今天一直在和鼻子和固定装置打交道,忍不住觉得自己做错了什么 我把所有的测试都写成函数,一切正常,但我想把它们转移到测试类中,因为我认为这样比较整洁,测试可以从中继承 我在包级别为所有测试创建到testdb的连接、要使用的事务和许多装置。应用程序中的存储库类使用此连接从数据库加载测试数据 我试图用要测试的类作为属性来创建测试类。这是在测试类的\uuuu init\uuu函数中设置的 我遇到的问题是,我正在测试的类需要使用测试数据库中的数据进行实例化,但是Nose在运行包设置函数之前创建了测试类的

我今天一直在和鼻子和固定装置打交道,忍不住觉得自己做错了什么

我把所有的测试都写成函数,一切正常,但我想把它们转移到测试类中,因为我认为这样比较整洁,测试可以从中继承

我在包级别为所有测试创建到testdb的连接、要使用的事务和许多装置。应用程序中的存储库类使用此连接从数据库加载测试数据

我试图用要测试的类作为属性来创建测试类。这是在测试类的
\uuuu init\uuu
函数中设置的

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

我能让它工作的唯一方法是添加一个模块设置函数,该函数将我要测试的类定义为全局类,然后在测试方法中使用该全局类,但这看起来相当粗糙。有人能提出更好的办法吗

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

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)
如果你知道一个更好的方法来实现这一点,那么请分享:)谢谢

如果您正在转向基于类的测试,那么您最好使用将在每个测试方法之前运行的
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
有什么缺点吗?我只能看到测试运行程序独立性的一个附带好处。所有测试运行程序都将支持本机unittest。