Python unittest - 使用setupclass,还有多个setup / takedown?

时间:2017-06-23 05:37:01

标签: python inheritance python-unittest class-method

我理解为类调用setUpClass/tearDownClass方法一次,并且在每个单元测试之前/之后调用setUp()/tearDown()。有关此标准设置,请参阅下面的代码段:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        do_expensive_setup_of_immutable_objects_used_by_all_tests()

    def setUp(self):
        do_setup_before_each_test()

    def test1(self):
        do_test1_stuff()

    def test2(self):
        do_test1_stuff()

    def tearDown(self):
        do_teardown_after_each_test()

    @classmethod
    def tearDownClass(cls):
        do_teardown_of_immutable_objects_used_from_all_tests()

但是,我希望某些单元测试与其他单元测试具有不同的setUp()tearDown()。什么被认为是一个很好的测试结构来实现这个功能?我有什么选择?我对Python缺乏经验,并希望知道采用一种好的风格来编写涉及昂贵的setUp()程序的单元测试。

1 个答案:

答案 0 :(得分:2)

也许这就是@Klaus的意思?

import unittest


class TestA(unittest.TestCase):
    def setUp(self):
        print "Setup # 1"

    def test1(self):
        print "Doing test1"

class TestB(unittest.TestCase):
    def setUp(self):
        print "Setup # 2"

    def test2(self):
        print "Doing test2"


if __name__ == "__main__":
    unittest.main()

或者,您可以根据方法名称更改设置 虽然这可能有点难以维持。

class TestA(unittest.TestCase):
    def setUp(self):
        if self._testMethodName == "test1":
            print "Setup # 1"
        elif self._testMethodName == "test2":
            print "Setup # 2"

    def test1(self):
        print "Doing test1"

    def test2(self):
        print "Doing test2"


if __name__ == "__main__":
    unittest.main()

两者产生相同的输出:

Output:
Setup # 1
Doing test1
.Setup # 2
Doing test2
.
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

编辑: 对不起,我不认为我完全理解,但这是我尝试实施您的评论。 我的方法是重新应用BaseTest.setUp(),而不是像你所描述的那样尽量保持原样 TypeOneTestsTypeTwoTests继承BaseTest,他们使用BaseTest

在他们自己的setUp内调用super(...)class BaseTest(unittest.TestCase): def setUp(self): print "BaseTest setUp" def tearDown(self): print "BaseTest tearDown" # you could add tests here but I didn't add any based on your comment class TypeOneTests(BaseTest): def setUp(self): super(TypeOneTests, self).setUp() print "TypeOneTests setUp" def tearDown(self): print "TypeOneTests tearDown" def test(self): print "a test in TypeOneTests" class TypeTwoTests(BaseTest): def setUp(self): super(TypeTwoTests, self).setUp() print "TypeTwoTests additional setUp" def tearDown(self): print "TypeTwoTests tearDown" super(TypeTwoTests, self).tearDown() def test(self): print "a test in TypeTwoTests" if __name__ == "__main__": unittest.main() 函数
BaseTest setUp
TypeOneTests setUp
a test in TypeOneTests
TypeOneTests tearDown
.BaseTest setUp
TypeTwoTests additional setUp
a test in TypeTwoTests
TypeTwoTests tearDown
BaseTest tearDown
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK

输出:

declare @Directory [varchar](max), @FileXMLName [varchar](max), @URLFileXML 
[varchar](max), @url [varchar](max)
SET @Directory = 'C:\Users\bamba\Desktop\'
SET @FileXMLName = 'testing.xml'
SET @URLFileXML = @Directory + @FileXMLName
SET @url = '''' + @URLFileXML + ''''

INSERT INTO XMLwithOpenXML(XMLData, XMLLoadedFromFolder, rowstatus , 
ModifiedDate, ModifiedBy)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, @Directory,'TRUE', GETDATE(), 
(SELECT TOP 1 sdes.original_login_name FROM sys.dm_exec_sessions AS sdes 
ORDER BY sdes.session_id DESC)  
--FROM OPENROWSET(BULK 'C:\Users\bamba\Desktop\testing.xml', SINGLE_BLOB) AS 
x; --> this line work, but i need some variable to replace the path.
FROM OPENROWSET(BULK '''' + @URL + '''', SINGLE_BLOB) AS x; -->this can't 
work