目录
unittest框架解析
unittest是python的单元测试框架,直接提供了创建测试用例,测试套件以及批量执行的方案
直接进行 import unittest 就可以使用
作为单元测试的框架,unittest也是可以对程序最小模块的一种敏捷化测试。利用单元测试框架
创建一个类,该类继承unittest 的TestCase 这样可以把每个case看成是一个最小的单元,由测试容器
组织起来,到时候直接执行,同时引入测试报告。
unittest各组件的关系 :
test fixture : 初始化和清理测试环境,比如创建临时的数据库,文件和目录 test case : 单元测试庸用例,TestCase 是编写单元测试用例最常用的类 test suite : 单元测试用例的集合,TestSuite 是最长用的类 test runner : 执行单元测试 test report : 生成测试报告
from selenium import webdriver
import unittest
import time
import os
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException
class testBaidu1(unittest.TestCase):
def setUp(self):
print("----setUp----")
self.driver = webdriver.Chrome()
self.url = "https://www.baidu.com/"
self.driver.maximize_window()
time.sleep(3)
#测试用例
def test_hao(self):
driver = self.driver
url = self.url
driver.get(url)
driver.find_element_by_link_text("hao123").click()
time.sleep(4)
def test_baidu(self):
driver = self.driver
url = self.url
driver.get(url)
#self.assertEqual("突如其来的假期_百度搜索")
driver.find_element_by_id("kw").send_keys("突如其来的假期")
driver.find_element_by_id("su").submit()
time.sleep(4)
print(driver.title)
time.sleep(4)
#test fixture 清除环境
def tearDown(self):
print("----tearDown----")
self.driver.quit()
if __name__ == "__main__" :
unittest.main()
if __name__ == "__main__" :
unittest.main()
#如果 name == main 则执行 main 方法
#unittest是python自带的单元测试框架
#unittest.main()运行开头为“test”的函数。
#可以增加verbosity参数,例如unittest.main(verbosity=2)
#在主函数中,直接调用main() ,在main中加入verbosity=2 ,这样测试的结果就会显示的更加详细。
#这里的verbosity 是一个选项, 表示测试结果的信息复杂度,有三个值:
#0 ( 静默模式): 你只能获得总的测试用例数和总的结果比如总共100个失败,20 成功80
#1 ( 默认模式): 非常类似静默模式只是在每个成功的用例前面有个“ . ” 每个失败的用例前面有个“F”
#2 ( 详细模式): 测试结果会显示每个测试用例的所有相关的信息
tips:在代码编写的过程中发现自己的 unittest.TestCase 方法没办法调用出来 原因: 包或者文件夹的命名问题,将自己的包命名为 unitest 因此 Python就会调用自己命名的unitest包下的类,而不是Python自带的unittest 包,因此将名称改为 其他的非unittest 即可。
批量执行脚本
addTest() 的应用
当有多个或者几百个测试用例的时候这样就需要一个测试套件,把测试用例放在该容器中进行执行
unittest 模块中提供了 TestSuite 类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTset 来把每个测试用例加入到测试套件中去。把一个测试赛脚本中的某几个测试用例方法添加到测试套件中.
#addTest(脚本名称.类方法.方法名称)
#addTest
suite = unittest.TestSuite()
suite.addTest(testbaidu1.Baidu1("test_hao"))
suite.addTest(testbaidu1.Baidu1("test_hbaidu"))
suite.addTest(testbaidu2.Baidu2("test_hao"))
suite.addTest(testbaidu2.Baidu2("test_baidusearch"))
return suite
makeSuite ()
把一个测试脚本中的所有的测试用例方法添加到测试套件
#addTest(unittest.makeSuite(脚本名称.类名称))
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(testbaidu1.Baidu1))
suite.addTest(unittest.makeSuite(testbaidu2.Baidu2))
return suite
TestLoader()
#unittest.TestLoader().loadTestsFromTestCase(脚本名称.类名称)
#TestLoader
suite1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
suite = unittest.TestSuite([suite1, suite2])
return suite
discover()的应用
#把一个文件中的所有以某种形式命名的测试脚本中的所有测试用方法添加到测试套件
#discover = unittest.defaultTestLoader.discover(具体文件夹(相对路径),pattern = 测#试脚本名称通配符,top_level_dir = None)
def createsuite() :
discover = unittest.defaultTestLoader.discover("../test_unittest",pattern="testBaidu*.py",top_level_dir=None)
print(discover)
return discover
用例执行顺序
unittest 框架默认加载测试用例的顺序是根据 ASCII码表的顺序,数学与字母的顺序为: 0-9,A-Z,a-z。 所以, TestAdd 类会优先于TestBdd 类被发现, test_aaa() 方法会优先于test_ccc() 被执行。对于测试目录与测试文件来说, unittest 框架同样是按照这个规则来加载测试用例。
忽略用例的执行
@unittest.skip("skipping")
unittest断言
自动化测试脚本如何判断实际结果和预期结果是否一致 self.assertEqual(预期判断的结果,driver.title,msg="实际的结果与预期的结果不一致") asserEqual(预期结果,实际结果,msg = "实际结果与预期的结果输入不一致的时候输出的信息")
HTML报告生成
import HTMLTestRunner
import os
import sys
import time
import unittest
def createsuite() :
discover = unittest.defaultTestLoader.discover("../test_unittest",pattern="testBaidu*.py",top_level_dir=None)
print(discover)
return discover
if __name__ == "__main__" :
curpath = sys.path[0]
print(sys.path)
print(sys.path[0])
#创建文件夹,创建的这个文件夹可以干什么
if not os.path.exists(curpath+'/resultreport') :
os.makedirs(curpath+'/resultreport')
#文件夹的命名不能让名称重复
now = time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
print(now)
print(time.time())
print(time.localtime(time.time()))
#文件名
filename = curpath + '/resultreport/' + now + 'resultreport.html'
with open(filename , 'wb') as fp :
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告",
description=u"用例执行情况", verbosity=2)
suite = createsuite()
runner.run(suite)