2016-09-19 428 views
1

假设我有在其工作期间创建SVN分支的实体。要执行功能测试我创建多个基本相同的方法(我使用Python单元测试框架,但问题涉及到任何测试框架):将参数传递给tearDown方法

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不接受任何参数。 我看到一些很肮脏的解决方案:

一)创建测试场“used_url”,将其设置在每一个方法和拆卸使用:

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)并从每一个方法

是否有任何其他的方式调用它呢?

+0

有些人认为''tearDown''应该永远不会被添加到测试框架中。让你的“b”解决方案成为正确的解决方案。我会用适当的异常处理来创建参数化测试以消除重复。 – zhon

回答

0

我认为b)解决方案即使在每次测试中都要求调用助手方法,并且对我来说似乎是一种重复,也可以工作。 另一种方法可能是调用“assertUrlExists”函数内的帮助器方法。通过这种方式,重复被删除,您可以避免再次检查URL的存在以管理清理:您拥有断言结果,您可以使用它。