介绍一下unittest测试框架中最重要的四个部分:TestCase测试用例、Test Suite测试套件、Test Runner测试执行、Test Fixture测试环境准备。
脚本例子
先上个脚本吧:
import unittest
import time
from selenium import webdriver
class testBaidu(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Chrome()
self.url=r"http://www.baidu.com"
def test_news(self):
self.driver.get(self.url)
self.driver.find_element_by_link_text("新闻").click()
time.sleep(3)
self.assertEqual(self.driver.current_url,r"http://news.baidu.com/")
def test_hao123(self):
self.driver.get(self.url)
self.driver.find_element_by_link_text("hao123").click()
time.sleep(3)
self.assertEqual(self.driver.current_url,r"https://www.hao123.com/")
def test_tieba(self):
self.driver.get(self.url)
self.driver.find_element_by_link_text("贴吧").click()
time.sleep(3)
self.assertEqual(self.driver.current_url,r"https://tieba.baidu.com/index.html")
def tearDown(self):
self.driver.quit()
if __name__=="__main__":
mysuite=unittest.TestSuite()
mysuite.addTest(testBaidu("test_news"))
mysuite.addTest(testBaidu("test_hao123"))
myrunner=unittest.TextTestRunner()
myrunner.run(mysuite)
脚本说明
其实上一个博客中,我们已经接触了TestCase和TestFixture了,这节里我们加上TestSuite和TestRunner。
1、TestCase:我们这里还是新建了类testBaidu,继承了unittest.TestCase类,也就继承了该类的所有变量和方法。在testBaidu类里,我们新建了test_news,test_hao123,test_tieba这三个测试方法,分别用来测试能否正确打开百度新闻、hao123、百度贴吧页面。
2、TestSuite:测试套件,实际上就是一个测试用例组,里面可包含多个测试用例。例子中,
mysuite=unittest.TestSuite()先实例化了一个TestSuite
mysuite.addTest(testBaidu(“test_news”))再向该套件中添加了要执行的测试用例。
3、TestRunner:测试执行,与TestSuite配合使用,用来执行测试套件。
4、TestFixture:测试环境准备,指的就是setUp和tearDown方法,用来定义测试用例的前置和后置动作。
执行结果
1、例子中我们向套件中添加了两个用例,而没有将test_tieba添加进去,所以执行时,test_tieba并不会执行。
2、执行顺序,按照套件中添加用例的顺序执行,即先执行test_news,再执行test_hao123。这里就解决了上个博客中使用unittest.main()执行时执行顺序与期望不一致的问题。
更多TestFixture介绍
在上面脚本执行时,每一个测试方法执行时,步骤都是启动浏览器 - 执行测试用例 - 关闭浏览器,即要执行3个用例的话,浏览器会打开和关闭3次,是很浪费时间的。这里我们可使用类方法setUpClass和tearDownClass,类方法在整个测试类开始和结束时执行,而不是在测试方法开始和结束时执行。
脚本调整为:
import unittest
import time
from selenium import webdriver
class testBaidu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver=webdriver.Chrome()
cls.url=r"http://www.baidu.com"
def test_news(self):
self.driver.get(self.url)
self.driver.find_element_by_link_text("新闻").click()
time.sleep(3)
self.assertEqual(self.driver.current_url,r"http://news.baidu.com/")
def test_hao123(self):
self.driver.get(self.url)
self.driver.find_element_by_link_text("hao123").click()
time.sleep(3)
self.assertEqual(self.driver.current_url,r"https://www.hao123.com/")
def test_tieba(self):
self.driver.get(self.url)
self.driver.find_element_by_link_text("贴吧").click()
time.sleep(3)
self.assertEqual(self.driver.current_url,r"https://tieba.baidu.com/index.html")
@classmethod
def tearDownClass(cls):
cls.driver.quit()
if __name__=="__main__":
mysuite=unittest.TestSuite()
mysuite.addTest(testBaidu("test_news"))
mysuite.addTest(testBaidu("test_hao123"))
mysuite.addTest(testBaidu("test_tieba"))
myrunner=unittest.TextTestRunner()
myrunner.run(mysuite)
脚本与之前区别:
1、由类方法setUpClass代替setUp方法,由类方法tearDownClass代替tearDown方法。
2、类方法setUpClass的上方需要加上类装饰器@classmethod,来标识这是个类方法。
3、类方法的参数由self变为cls。
执行效果:
启动浏览器,执行三个测试用例,关闭浏览器。