将参数传递给tearDown方法

时间:2016-09-19 18:40:19

标签: unit-testing oop python-unittest teardown

假设我有在其工作期间创建SVN分支的实体。为了执行功能测试,我创建了几个几乎相同的方法(我使用python unittest框架,但问题与任何测试框架有关):

class Tester(unittest.TestCase):

def test_valid1_url(self):
    url="valid1"
    BranchCreator().create_branch(url)
    self.assertUrlExists(url) # assume I have this method implemented

def test_valid2_url(self):
    url="valid2"
    BranchCreator().create_branch(url)
    self.assertUrlExists(url) # assume I have this method implemented

def test_invalid_url(self):
    url="invalid"
    self.assertRaises(ValueError, BranchCreator().create_branch, url)

每次测试后,我想删除生成的分支,如果测试失败,则不执行任何操作。理想情况下,我会使用以下内容:

@teardown_params(url='valid1')
def test_valid1_url(self):

def tearDown(self, url):
    if (url_exists(url)): remove_branch(url)

但是tearDown不接受任何参数。 我看到几个非常脏的解决方案:

a)在Tester中创建字段“used_url”,在每个方法中设置它并在tearDown中使用:

def test_valid1_url(self):
    self.used_url="valid1"
    BranchCreator().create_branch(self.used_url)
    self.assertUrlExists(url) 
...
def tearDown(self):
    if (url_exists(self.used_url)): remove_branch(self.used_url)

它应该工作,因为(至少在我的环境中)所有测试都是顺序运行的,所以不存在冲突。但是由于共享变量,这个解决方案违反了测试独立性原则,如果我设法同时启动测试,它将无法工作。

b)使用单独的方法,如cleanup(self, url),并从每个方法中调用它

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

我认为b)解决方案可以工作,即使它要求在每个测试中调用辅助方法,这听起来像是一种重复。 另一种方法可能是在“assertUrlExists”函数中调用helper方法。通过这种方式,复制将被删除,您可以避免再次检查URL是否存在以便管理清理:您有断言结果并且可以使用它。