2015-11-27 27 views
0

我已经在我的基本页面上写了几个函数,并且正在尝试在我的测试中调用它。但是,如果其中一个功能失败,测试不会进一步进行。我如何使用selenium python来实现这个功能,以便测试能够继续运行并在稍后发出错误。执行测试用例2如果测试用例1发生故障等等,用Python Python

+0

TestCase类里面有多少'test_ *'函数? – Noah

+0

在我的测试中有6 –

+0

如果其中一个失败,是否所有六个测试函数都运行? – Noah

回答

0

在使用unittest.TestCase类或django.test.TestCase类进行的Python单元测试中,应该为每个要测试的逻辑概念创建一个test_*函数。单元测试只会因为一个原因而失败。可以有多种方法来测试一个原因,但测试应该只会因为一个原因而失败。

测试类可以如下:

from django.test import LiveServerTestCase 
from selenium import webdriver 

class FooTestCase(LiveServerTestCase): 
    def setUp(self): 
     self.browser = webdriver.Firefox() 
     [...] 

    def tearDown(self): 
     self.browser.quit() 
     [...] 

    def test_thing_one(self): 
     self.browser.get(self.live_server_url) 
     self.assertIn('My Title', self.browser.title) 

    def test_thing_two(self): 
     [...] 
     self.assertTrue(foobar) 

在这个类有2种test_*功能。当你运行这个测试案例,并通过你会看到输出类似:

.. 
------------------------------- 
Ran 2 tests in 0.213s 

它告诉我们它跑了两个测试。注意它也有两个时期。每个测试一个。周期意味着测试通过。两人都通过了如果第一次测试失败,我们会看到:

F. 
=============================== 
FAIL: test_thing_one (mytests.FooTestCase) 
------------------------------- 
Traceback (most recent call last): 
# stack trace here 
AssertionError: (rest of error) 
------------------------------- 
Ran 2 tests in 0.213s 

FAILED (failures=1) 

这一次的时期之一已被替换字母F.还有一个周期,其表示测试通过。注意到F先出现了。这意味着test_thing_one首先运行并失败,即使失败test_thing_two仍然正常运行并通过。

test_thing_one我们可以使用多种断言如下:

def test_thing_one(self): 
    [...] 
    self.assertIn(x, bar_list) 
    self.assertTrue(something) 
    self.assertIsInstance(a, b) 

现在,如果assertTrue失败test_thing_one将停止在点和assertIsInstance将永远不会被调用。这是正确的行为。如果即使assertTrue失败,仍然要assertIsInstance被调用,那么您应该创建一个新的test_*方法并将assertIsInstance移动到该方法。

一般而言,您应该只有一个assert*test_*。这将帮助您将其限制为仅测试一个概念。如果这三个断言只测试一个概念,那么这是可以的,因为您会知道在代码中何处去解决这个小问题。如果assertTrue测试一段代码,并且assertIsInstance测试另一段代码,则它们应该位于两个单独的test_*方法中。


如果你有6个测试案例和你没有看到的6个周期或F然后别的异常正在发生的组合。如果是这种情况,请更新您的问题与错误,以便我们可以解决这个问题。

+0

我明白你的观点。非常感谢你 –

+0

很好的单元测试建议,但我不认为它回答了OP的问题。 –

+0

@Chiragverma这实际上帮助你并回答你的问题吗?你的测试实际上没有完成,或者这有助于你理解为什么他们中途失败? – Noah

0

我已经使用以下方法来实现此目的。这是正确的方法吗?

class mytest(BaseTestCase, unittest.TestCase): 

    def setUp(self): 
     super(mytest, self).setUp() 



    def test_one(self): 
     # content 


    def test_two(self): 
     # content 

    def test_three(self): 
     # content 

    def test_four(self): 
     # content 

    def test_five(self): 
     # content 

    def test_six(self): 
     # content   


    def tearDown(self): 
     super(mutest, self).tearDown() 
+0

是的,这是正确的想法。您不需要调用超类'setUp'或'tearDown'方法。默认的实现实际上什么都不做。我不确定'BaseTestCase'是什么。如果这是你的一个类,并且你想要做多重继承,那很好。否则,你只需要扩展'unittest.TestCase'。如果使用django,你可以扩展'django.test.TestCase'。 – Noah