引入 unittest 框架
相想使用unittest 框架,首先要引入unittest 包
import unittest
class Baidu(unittest.TestCase):
Baidu 类继承 unittest.TestCase 类,从TestCase 类继承是告诉unittest 模块的方式,这是一个测试案例。
def setUp(self):
self.driver = webdriver.Firefox()
self.base_url = "http://www.baidu.com/"
setUp 用于设置初始化的部分,在测试用例执行前,这个方法中的函数将先被调用。这里将浏览器的调用和URL 的访问放到初始化部分。
self. verificationErrors = []
脚本运行时,错误的信息将被打印到这个列表中。
self.accept_next_alert = True
是否继续接受下一下警告
def test_baidu(self):
driver = self.driver
driver.get(self.base_url + "/" )
test_baidu 中放置的就是我们的测试脚本。
def is_element_present(self, how, what):
try : self.driver.find_element(by=how, value=what)
except NoSuchElementException, e: return False
return True
is_element_present 函数用来查找页面元素是否存在,在这里用处不大,通常删除。因为判断页面元素是否存在一般都加在testcase 中。
def is_alert_present(self):
try : self.driver.switch_to_alert()
except NoAlertPresentException, e: return False
return True
对弹窗异常的处理
def close_alert_and_get_its_text(self):
try :
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else :
alert.dismiss()
return alert_text
finally : self.accept_next_alert = True
关闭警告和对得到文本框的处理。
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
tearDown 方法在每个测试方法执行后调用,这个地方做所有清理工作,如退出
浏览器等。
if __name__ == "__main__":
unittest.main()
unitest.main()函数用来测试类中以test 开头的测试用例。
unittest 单元测试框架解析
- 用import 语句引入unittest 模块
- 让所有执行测试的类都继承于TestCase 类,可以将TestCase 看成是对特定类进行测试的方法的集合
- setUp()方法中进行测试前的初始化工作,tearDown()方法中执行测试后的清除工作。setUp()和tearDown()都是TestCase 类中定义的方法
- 在testSize()中调用assertEqual()方法,对Widget 类中getSize()方法的返回值和预期值进行比较,确保两者是相等的,assertEqual()也是TestCase 类中定义的方法。
- 提供名为suite()的全局方法,PyUnit 在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,可以将TestSuite 看成是包含所有测试用例的一个容器。
采用PyUnit 提供的动态方法,只编写一个测试类来完成对整个软件模块的测试,这样对象的初始化工作可以在setUp()方法中完成,而资源的释放则可以在tearDown()方法中完成。
我们可以在一个测试类中,写多个测试用例对被测试类的方法进行测试。
完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,在PyUnit 中是用TestSuite 类来表示的。可以在单元测试代码中定义一个名为suite()的全局函数,并将其作为整个单元测试的入口,PyUnit 通过调用它来完成整个测试过程。
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase( "testSize"))
suite.addTest(WidgetTestCase( "testResize"))
return suite
如果用于测试的类中所有的测试方法都以test 开头,Python 程序员甚至可以用PyUnit 模块提供的makeSuite()方法来构造一个。
def suite():
return unittest.makeSuite(WidgetTestCase, "test")
TestSuite 类可以看成是TestCase 类的一个容器,用来对多个测试用例进行组织,这样多个测试用例可以自动在一次测试中全部完成。
PyUnit 使用TestRunner 类作为测试用例的基本执行环境,来驱动整个单元测试过程。
runner = unittest.TextTestRunner()
runner.run(suite)
# 测试
if __name__ == "__main__" :
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase( "testSize"))
suite.addTest(WidgetTestCase( "testResize"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
PyUnit 模块中定义了一个名为main 的全局方法,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用TestLoader 类来搜索所有包含在该模块中的测试方法,并自动执行它们。如果Python 程序员能够按照约定(以test开头)来命名所有的测试方法,那就只需要在测试模块的最后加入如下几行代码即可:
# 测试
if __name__ == "__main__" :
unittest.main()
批量执行测试集
合理的做法是一个例一个文件,把所文件放一个文件夹下,通过单独的脚本控制所有用例的执行,将脚本的执行结果输出到一个log 文件中。
执行用例集的脚本:
#-*-coding=utf-8 -*-
import os
#列出某个文件夹下的所有case,这里用的是python,所在py 文件运行一次后会生成一个pyc的副本
caselist=os.listdir( 'D:\selenium_use_case\test_case')
for a in caselist:
s=a.split('.')[1:][0] #选取所要执行的用例
if s== 'py':
#此处执行dos 命令并将结果保存到log.txt
os.system( 'D:\selenium_use_case\test_case\%s 1>>log.txt 2>&1'%a )