運(yùn)行測(cè)試用例時(shí)俏扩,需要判斷用例是否執(zhí)行成功,此時(shí)需要有一個(gè)我們期望的結(jié)果來(lái)進(jìn)行驗(yàn)證卖哎。這里unittest中鬼悠,如果一個(gè)case執(zhí)行的過(guò)程中報(bào)錯(cuò)删性,或者我們判斷結(jié)果不符合期望,就會(huì)判定此條用例執(zhí)行失敗焕窝,判斷的條件主要是根據(jù)斷言來(lái)實(shí)現(xiàn)蹬挺,這節(jié)主要學(xué)習(xí)下斷言的使用。
一它掂、斷言的方法
1.1 TestCase類(lèi)中的部分?jǐn)嘌苑椒?/b>
判斷條件是否成立
assert_(expr,msg)
expr:判斷條件巴帮,返回Boolean值
msg:判斷失敗后顯示的信息
判斷兩個(gè)數(shù)據(jù)的值是否相同
assertEqual(first,second,msg)
first:第一個(gè)數(shù)據(jù)
second:第二個(gè)數(shù)據(jù)
msg:判斷失敗后顯示的信息
判斷兩個(gè)數(shù)據(jù)的值是否不相同
assertEqual(first,second,msg)
first:第一個(gè)數(shù)據(jù)
second:第二個(gè)數(shù)據(jù)
msg:判斷失敗后顯示的信息
判斷條件是否為真
assertTrue(expr,msg)
expr:判斷條件
msg:判斷失敗后顯示的信息
判斷條件是否為假
assertFalse(expr,msg)
expr:判斷條件
msg:判斷失敗后顯示的信息
判斷兩個(gè)數(shù)據(jù)是否相同
assertIs(first,second,msg)
first:第一個(gè)數(shù)據(jù)
second:第二個(gè)數(shù)據(jù)
msg:判斷失敗后顯示的信息
判斷兩個(gè)數(shù)據(jù)是否不相同
assertIsNot(first,second,msg)
first:第一個(gè)數(shù)據(jù)
second:第二個(gè)數(shù)據(jù)
msg:判斷失敗后顯示的信息
判斷數(shù)據(jù)是否存在
assertIsNone(obj,msg)
obj:所傳的數(shù)據(jù)
msg:判斷失敗后顯示的信息
判斷數(shù)據(jù)是否不存在
assertIsNotNone(obj,msg)
obj:所傳的數(shù)據(jù)
msg:判斷失敗后顯示的信息
判斷數(shù)據(jù)a是否包含在數(shù)據(jù)b中
assertIn(a,b,msg)
a:數(shù)據(jù)a
b:數(shù)據(jù)b
msg:判斷失敗后顯示的信息
判斷數(shù)據(jù)a是否不包含在數(shù)據(jù)b中
assertNotIn(a,b,msg)
a:數(shù)據(jù)a
b:數(shù)據(jù)b
msg:判斷失敗后顯示的信息
1.2 直接使用assert斷言
習(xí)慣直接使用python中的assert斷言,替代unittest.TestCase中的斷言方法:
具體可以直接使用:
assert a == b
assert a != b
assert a in b
assert a not in b
assert a in None
assert a in not None
二虐秋、在框架中使用斷言
由于在使用unittest中榕茧,每個(gè)類(lèi)都繼承了unittest.TestCase,所以使用時(shí)客给,直接在方法里使用self來(lái)調(diào)用斷言方法用押。
import unittest
class Demo(unittest.TestCase):
? ? def test_01(self):
? ? ? ? self.assertEqual("demo","demo","兩者不相等")
如果直接使用assert斷言,則可以直接調(diào)用靶剑。
import unittest
class Demo(unittest.TestCase):
? ? def test_01(self):
? ? ? ? assert "demo" == "demo"
三蜻拨、實(shí)例演示
這里使用百度貼吧的例子,第一個(gè)case是打開(kāi)新頁(yè)面桩引,然后判斷新頁(yè)面的title是否是我們期望的缎讼,第二個(gè)case則是我們故意判斷一個(gè)錯(cuò)誤的title,使得斷言失敗坑匠,這兩個(gè)case也分別使用上述的兩種斷言方法休涤。
# -*- coding:utf-8 -*-
from selenium import webdriver
import unittest
from time import sleep
class PcLogin(unittest.TestCase):
? ? @classmethod
? ? def setUpClass(cls):
? ? ? ? print("所有測(cè)試開(kāi)始")
? ? def setUp(self):
? ? ? ? print("測(cè)試開(kāi)始")
? ? ? ? self.driver = webdriver.Chrome()
? ? ? ? self.driver.implicitly_wait(30)
? ? ? ? self.driver.set_page_load_timeout(30)
? ? ? ? self.driver.get("https://tieba.baidu.com/")
? ? def test_01_demo(self):
? ? ? ? """打開(kāi)新頁(yè)簽"""
? ? ? ? self.driver.find_element_by_css_selector("a[title = '娛樂(lè)明星']").click()
? ? ? ? all = self.driver.window_handles
? ? ? ? self.driver.switch_to.window(all[1])
? ? ? ? sleep(5)
? ? ? ? assert self.driver.title == "娛樂(lè)明星_百度貼吧", "斷言失敗,當(dāng)前頁(yè)面title是%s " % self.driver.title
? ? def test_02_demo2(self):
? ? ? ? """判斷首頁(yè)標(biāo)題"""
? ? ? ? # 這個(gè)例子會(huì)斷言失敗
? ? ? ? self.assertEqual(self.driver.title, "娛樂(lè)明星_百度貼吧")
? ? def tearDown(self):
? ? ? ? print("測(cè)試完成")
? ? ? ? self.driver.close()
? ? @classmethod
? ? def tearDownClass(cls):
? ? ? ? print("所有測(cè)試結(jié)束")
if __name__ == '__main__':
? ? unittest.main()
運(yùn)行結(jié)果:(運(yùn)行了兩條用例笛辟,其中失敗了一條功氨;符合我們預(yù)期的結(jié)果)
所有測(cè)試開(kāi)始
測(cè)試開(kāi)始
測(cè)試完成
.測(cè)試開(kāi)始
測(cè)試完成
F
======================================================================
FAIL: test_02_demo2 (__main__.PcLogin)
判斷首頁(yè)標(biāo)題
所有測(cè)試結(jié)束
----------------------------------------------------------------------
Traceback (most recent call last):
? File "D:/1git/uitest/test_case/demo.py", line 30, in test_02_demo2
? ? self.assertEqual(self.driver.title, "娛樂(lè)明星_百度貼吧")
AssertionError: '百度貼吧——全球最大的中文社區(qū)' != '娛樂(lè)明星_百度貼吧'
- 百度貼吧——全球最大的中文社區(qū)
+ 娛樂(lè)明星_百度貼吧
----------------------------------------------------------------------
Ran 2 tests in 35.273s
FAILED (failures=1)
Process finished with exit code 1