web自动化03-unittest框架-断言-

 

 1.UnitTest框架

  1.1 什么是框架?
说明:
1. 框架英文单词framework
2. 为解决一类事情的功能集合
1.2 什么是UnitTest框架?
概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试。
1.3 为什么使用UnitTest框架?
1. 能够组织多个用例去执行
2. 提供丰富的断言方法
3. 能够生成测试报告
1.4 UnitTest核心要素
1. TestCase
2. TestSuite
3. TestRunner
4. TestLoader
5. Fixture
 
2. TestCase
说明:TestCase就是测试用例
2.1 案例
定义一个实现加法操作的函数,并对该函数进行测试
2.2 定义测试用例
1. 导包:import unittest
2. 定义测试类:新建测试类必须继承unittest.TestCase
3. 定义测试方法:测试方法名称命名必须以test开头
2.3 执行测试用例
方式一:
使用pycharm在代码上点击鼠标右键,选择使用UnitTest运行
方式二:
调用 unittest.main() 来运行
思考:如何同时运行多个测试用例?
3. TestSuite
说明:(翻译:测试套件)多条测试用例集合在一起,就是一个TestSuite
使用:
1. 实例化:
suite = unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:
suite.addTest(ClassName("MethodName"))
(ClassName:为类名;MethodName:为方法名)
3. 添加扩展:
suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内test开头的方法并添加到测试套件中)
提示:TestSuite需要配合TestRunner才能被执行
4. TextTestRunner
说明:TextTestRunner是用来执行测试用例和测试套件的
使用:
1. 实例化:
runner = unittest.TextTestRunner()
2. 执行:
runner.run(suite) # suite:为测试套件名称
需求
将test01.py..test10.py共10条用例,将这10条用例批量执行;
问题
1. 使用suite.addtest(unittest.makeSuite(className))导入10条测试类
2. .addtest()需要添加10次
5. TestLoader
说明:
用来加载TestCase到TestSuite中,即加载满足条件的测试用例,并把测试用例封装成测试套件。
使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件
,并将查找到的测试用例组装到测试套件;
用法:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
test_dir: 为指定的测试用例的目录
pattern:为查找的.py文件的格式,默认为'test*.py'
也可以使用unittest.defaultTestLoader 代替 unittest.TestLoader()
运行:
runner = unittest.TextTestRunner()
runner.run(suite)

 

5.1 TestLoader与TestSuite区别
1. TestSuite需要手动添加测试用例(可以添加测试类,也可以添加测试类中某个测试方法)
2. TestLoader搜索指定目录下指定开头.py文件,并添加测试类中的所有的测试方法,不能指定添加测试方法;
 

Fixture
 
1.Fixture
说明:Fixture是一个概述,对一个测试用例环境的初始化和销毁就是一个Fixture
Fixture控制级别:
1. 方法级别
2. 类级别
3. 模块级别
 
1.1 方法级别
使用:
1. 初始化(前置处理):
def setUp(self) --> 首先自动执行
2. 销毁(后置处理):
def tearDown(self) --> 最后自动执行
3. 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown
1.2 类级别
使用:
1. 初始化(前置处理):
@classmethod
def setUpClass(cls): --> 首先自动执行
2. 销毁(后置处理):
@classmethod
def tearDownClass(cls): --> 最后自动执行
3. 运行于测试类的始末,即:每个测试类只会运行一次setUpClass和tearDownClass
 
1.3 模块级别 [了解]
使用:
1. 初始化(前置处理):
def setUpModule() --> 首先自动执行
2. 销毁(后置处理):
def tearDownModule() --> 最后自动执行
3. 运行于整个模块的始末,即:整个模块只会运行一次setUpModule和tearDownModule
 
2. 案例
需求:使用UnitTest框架对tpshop项目测试
1). 点击登录,进入登录页面
2). 输入用户名和密码,不输入验证码,直接点击登录按钮
3). 获取错误提示信息
2.1 示例代码
import time
import unittest
from selenium import webdriver
class TestLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.get("http://localhost")
self.driver.implicitly_wait(10)
self.driver.maximize_window()
def test_login(self):
# 点击登录按钮
self.driver.find_element_by_link_text("登录").click()
# 输入用户名
self.driver.find_element_by_id("username").send_keys("13012345678")
# 输入密码
self.driver.find_element_by_id("password").send_keys("123456")
# 点击登录按钮
self.driver.find_element_by_css_selector("[name='sbtbutton']").click()
# 获取错误提示信息
msg = self.driver.find_element_by_css_selector(".layui-layer-content").text
print("msg=", msg)
def tearDown(self):
time.sleep(3)
self.driver.quit()

 

2.2 总结
1. 必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture
2. setUp:一般做初始化工作,比如:实例化浏览器驱动对象、浏览器最大化、设置隐式等待等
3. tearDown:一般做结束工作,比如:关闭浏览器驱动对象、退出登录等
 

断言

  1. 什么是断言?

    让程序代替人工去校验系统执行的结果

  2. 需要掌握哪个断言?

    • assertEqual(期望结果, 实际结果)

    • assertTrue(exp)

    • assertIsNone(obj)

    • assertIn("a", "abc")

    • assertIn(1, [1, 2, 3])

  3. 断言异常类?

    AssertionError

  4. 注意:捕获到异常之后,最后通过raise继续向外抛出异常

参数化

安装插件:

pip install parameterized

导包:

from parameterized import parameterized

使用方式:

  • 方式一


    @parameterized.expand([(1, 2), (2, 3), (4, 5)])
    def test_add(self, x, y):
  • 方式二【了解】


    data = [(1, 2), (2, 3), (4, 5)]
    @parameterized.expand(data)
    def test_add(self, x, y):
  • 方式三

    # 定义到测试类的外面
    def bulid_data():
    # .....
    retrun [(1, 2), (2, 3), (4, 5)]

    @parameterized.expand(bulid_data)
    def test_add(self, x, y):

     

跳过

对于一些未完成的或者不满足条件的测试方法或测试类可以标记成跳过,代码不会被执行

 

  • 方式一:无条件的跳过

    @unittest.skip("原因")

  • 方式二:根据条件判断是否要跳过

    @unittest.skipIf(cond, reason="xxxx")

生成HTML测试报告

如何使用HTMLTestRunner生成测试报告?

  1. 把HTMLTestRunner.py文件复制到项目中

  2. 导包

    from day06.tools.HTMLTestRunner import HTMLTestRunner

  3. 创建测试套件

    • TestSuite

    • TestLoader

  4. 定义测试报告文件存放的路径

    report_path = './report/r20100101.html'

  5. 打开测试报告文件流


    # 该方式会自动关闭文件流
    with open(report_path, "wb") as f:
    # ....
  6. 示例化HTMLTestRunner对象

    runner = HTMLTestRunner(f, title="xxx", description="xxx")

  7. 执行测试套件

    runner.run(suite)

 

 
posted @ 2019-07-10 21:56  snailon  阅读(760)  评论(0)    收藏  举报