unittest 介绍了4 个重要的概念: test case, test suite, test runner,test fixture。
1、testcase: 一个TestCase 的实例就是一个测试用例, 就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),实现测试过程的代码(run),以及测试后环境的还原(tearDown)。元测试(unittest)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证。
setUp 用于设置初始化工作,在每一个测试用例前先被执行,它与tearDown方法相呼应,后者在每一个测试用例执行后被执行。这里的初始化工作定义了浏览器启动和基础URL 地址。
def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.base_url = "https://172.1.1.1/" self.verificationErrors = [] self.accept_next_alert = True
tearDown 方法在每个测试方法执行后调用,这个方法用于完成测试用例执行后的清理工作,如退出浏览器、关闭驱动,恢复用例执行状态等。在setUp()方法中定义了verificationErrors 为空数组,这里通过assertEqual()比较其是否为空,如果为空说明用例执行的过程过程中没有出现异常,否则将抛出AssertionError 异常:
def tearDown(self): self.driver.quit() self.assertEqual([], self.verificationErrors)
2、testsuite: 对一个功能的验证往往是需要多测试用例的,可以把多的测试用例集合在一起执行,这就产生了测试套件TestSuite 的概念,它用来组装单个测试用例,而且TestSuite 也可以嵌套TestSuite。
testSuite()可以被看作一个容器(测试套件),通过addTest 方法我们可罗列具体所要执行的测试用例。如果使用unittest.main() 的话默认会执行所有以test 开头的测试用例。
3、testrunner: TextTestRunner 是来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存到TextTestResult 实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
4、testfixture: 对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖TestCase 的setUp()和tearDown()方法来实现.
了解unittest框架之后,练习一个登录的例子,代码如下:
# coding=utf-8 from selenium import webdriver import unittest class task_a(unittest.TestCase): def setUp(self): #每个测试用例之前执行 self.driver=webdriver.Chrome() self.url="https://172.1.1.1" self.verificationErrors=[] self.accept_next_alter=True def tearDown(self): #每个测试用例之后执行 self.driver.quit() self.assertEqual([],self.verificationErrors) def test_1(self): u"测试用例1" driver=self.driver driver.get(self.url) driver.maximize_window() username='user1' driver.find_element_by_css_selector("input.login-form").send_keys(username) #定位到用户名输入框 driver.find_element_by_css_selector("input.passwd").send_keys('123456') #定位到密码输入框 driver.find_element_by_css_selector("input.btn.btn-default").click() #点击登录按钮 info = driver.find_element_by_css_selector("#userMenu > div.user-id").text self.assertEqual(username, info) print("login用例执行完成") if __name__=='__main__': unittest.main()