传递参数给tearDown方法

3

假设我有一个实体,在其工作期间创建SVN分支。为了进行功能测试,我创建多个几乎相同的方法(我使用Python单元测试框架,但问题涉及任何测试框架):

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),并从每个方法调用它

还有其他方法吗?


有些人认为在测试框架中永远不应该添加tearDown。因此,你的解决方案“b”是正确的。我会创建一个带有适当异常处理的参数化测试来消除重复。 - zhon
1个回答

0

我认为 b) 解决方案可以奏效,即使它要求在每个测试中调用辅助方法,这听起来像是一种重复。 另一种方法是在“assertUrlExists”函数内部调用辅助方法。这样可以消除重复,并且可以避免再次检查URL的存在以管理清理:您有断言结果并且可以使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接