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

时间:2014-09-17 14:58:22

标签: python unit-testing fixtures nose

我今天一直在与鼻子和固定装置作斗争,不禁觉得我做错了什么。

我把所有的测试都写成了函数,一切都运行正常,但我想将它们移到测试类中,因为我觉得它更整洁,然后可以继承测试。

我创建了一个与testdb的连接,要使用的事务,以及所有测试的包级别的许多fixture。应用程序中的存储库类使用此连接从数据库加载测试数据。

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

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

我能让它工作的唯一方法是添加一个模块设置函数,该函数定义我想要测试为全局的类,然后在测试方法中使用该全局,但这看起来非常h​​acky。任何人都可以提出更好的方法吗?

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

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)

如果您知道更好的方法来实现这一点,请分享:)谢谢!

1 个答案:

答案 0 :(得分:1)

如果您正在进行unittest.TestCase基于类的测试,那么您也可以使用在每个测试方法之前运行的setUp()/tearDown()方法,并使用setUpClass()来设置类特定的内容,以及鼻子将像单元测试那样处理它,如下所示:

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)