IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> (P1)Python单元测试之unittest单元测试 -> 正文阅读

[开发测试](P1)Python单元测试之unittest单元测试

1.unittest组件

  • unittest
    测试用例,方法命名基于test开头;
    测试用例自行排序执行顺序规则:A-Z,a-z,0-9,eg:test01/test02;
    add的用力不是用test开始就不会被识别,所以不会允许;

  • 组件1
    设置前置条件setUp;
    后置条件tearDown;
    每条测试用例方法执行前后都要执行前,后置条件

  • eg:Python_unitest/test_1.py

# -*-coding:utf-8-*-

import unittest

class Test(unittest.TestCase):

    def setUp(self) -> None:
        print("打开浏览器")
    
    def test1(self):
	    '''wangji 测试函数注释'''
        print('case 1')

    def test2(self):
        print('case 2')
    
    def tearDown(self) -> None:
        print('关闭浏览器')

if __name__ == '__main__':
    unittest.main()

结果:

[root@node-1 wangji]#  cd /home/wangji ; /usr/bin/env /bin/python3 /root/.vscode-server/extensions/ms-python.python-2021.9.1246542782/pythonFiles/lib/python/debugpy/launcher 43444 -- /home/wangji/Python_unitest/test_1.py 
打开浏览器
case 1
关闭浏览器
.打开浏览器
case 2
关闭浏览器
.
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK
  • 组件2
    前置setUpClass;
    后置tearDownClass;
    所有用力执行前只会执行一次前置和后置;
    方法前必须加装饰器:@classmethod
  • eg:Python_unitest/test_2.py
# -*-coding:utf-8-*-

import unittest

class Test(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("打开浏览器")
    
    def test1(self):
        print('case 1')

    def test2(self):
        print('case 2')
        
    @classmethod
    def tearDownClass(cls):
        print('关闭浏览器')

if __name__ == '__main__':
    unittest.main()
  • 测试:
[root@node-1 wangji]#  cd /home/wangji ; /usr/bin/env /bin/python3 /root/.vscode-server/extensions/ms-python.python-2021.9.1246542782/pythonFiles/lib/python/debugpy/launcher 38332 -- /home/wangji/Python_unitest/test_2.py 
打开浏览器
case 1
.case 2
.关闭浏览器

----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

2.Unittest套件-执行指定用例

  • 执行指定单条用例
    unittest.TestSuite()创建测试套件实例对象;
    suit.addTest(类名(“用例”));

  • 执行指定多条用例
    通过addTests([…])添加多个测试用例

  • eg:Python_unitest/test_3.py

# -*-coding:utf-8-*-

import unittest

class Test(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("打开浏览器")
    
    def test1(self):
        print('case 1')

    def test2(self):
        print('case 2')
        
    @classmethod
    def tearDownClass(cls):
        print('关闭浏览器')

if __name__ == '__main__':
    # 创建套件对象
    suit = unittest.TestSuite()
    # 添加指定用例
    suit.addTest(Test("test2"))

    ##添加多条用例
    # suit.addTests([Test("test1"), Test("test2")])
    run = unittest.TextTestRunner()
    run.run(suit)
  • 测试:
[root@node-1 wangji]#  cd /home/wangji ; /usr/bin/env /bin/python /root/.vscode-server/extensions/ms-python.python-2021.9.1246542782/pythonFiles/lib/python/debugpy/launcher 41655 -- /home/wangji/Python_unitest/test_3.py 
打开浏览器
case 2
.关闭浏览器

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

3.Unittest套件-运行单个类中所有用例

  • 运行类中用例
    先通过unittest.TestSuit()创建测试套件实例对象;
    再通过unittest.TestLoader()创建加载对象,加载测试用例类;
    再通过addTest()添加;
  • eg:执行一个类,Python_unitest/test_5.py
# -*-coding:utf-8-*-

import unittest

class Test(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("打开浏览器")
    
    def test1(self):
        print('case 1')

    def test2(self):
        print('case 2')
        
    @classmethod
    def tearDownClass(cls):
        print('关闭浏览器')

if __name__ == '__main__':
    # 创建套件对象
    suit = unittest.TestSuite()
    
    #创建类加载的对象
    load = unittest.TestLoader()
    suit.addTest(load.loadTestsFromTestCase(Test))

    run = unittest.TextTestRunner()
    run.run(suit)
  • eg:执行二个类,/home/wangji/Python_unitest/test_6.py
# -*-coding:utf-8-*-

import unittest

class Test(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("打开浏览器")
    
    def test1(self):
        print('case 1')

    def test2(self):
        print('case 2')
        
    @classmethod
    def tearDownClass(cls):
        print('关闭浏览器')

class Test2(unittest.TestCase):
    def test3(self):
        print('case 3')

    def test4(self):
        print('case 4')



if __name__ == '__main__':
    # 创建类加载的对象
    load = unittest.TestLoader()

    ## 分别加载两个类
    suit1 = load.loadTestsFromTestCase(Test)
    suit2 = load.loadTestsFromTestCase(Test2)

    ##放到套件里面
    suits = unittest.TestSuite([suit1, suit2])

    run = unittest.TextTestRunner()
    run.run(suits)

4.Unittest套件-批量运行用例

  • 运行指定目录下的所有用例

  • 使用Unittest下的discover方法

  • eg:Python_unitest/main.py

# -*-coding:utf-8-*-

import unittest

test_dir = "/home/wangji/Python_unitest"

##加载用例
dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

##创建套件
suit = unittest.TestSuite()

##添加用例
suit.addTest(dis)

# 执行用例
run = unittest.TextTestRunner()
run.run(suit)

5.Unittest生成测试报告

  • HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
  • 下载后需要修改:
    94行引入的名称要改,从 import StringIO修改成 import io
    539行 self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer=io.StringIO()
    631行 print >>sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime)修改成print (sys.stderr, - ‘\nTime Elapsed: %s’ %(self.stopTime-self.startTime))
    642行,if not rmap.has_key(cls): 修改成 if not cls in rmap:
    766行的uo = o.decode(‘latin-1’),修改成 uo=o
    772行,把 ue = e.decode(‘latin-1’) 直接改成 ue = e
    将HTMLTestRunner.py模块放到Linux位置:/usr/lib64/python3.6
>>> import sys
>>> sys.path
['', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/local/lib64/python3.6/site-packages', '/usr/local/lib/python3.6/site-packages', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages']
  • eg:Python_unitest/main.py
# -*-coding:utf-8-*-

import unittest
from unittest import suite
import HTMLTestRunner

# 用例的目录
test_dir = "/home/wangji/Python_unitest"
# 报告目录
report_dir = "/home/wangji/Python_unitest/report/"

# 生成html文件
file = open(report_dir + "result.html", "wb")

# 文件格式生成
runner = HTMLTestRunner.HTMLTestRunner(stream=file, title="标题", description="报告的描述")

##加载用例
suite = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

# 执行用例
runner.run(suite)
  • 测试:
    在这里插入图片描述

6.Unittest断言

  • 断言即测试用例执行结果和预期对比,符合就测试用例通过,反之不通过
  • 只能再继承unittest.TestCase的类中使用这些方法
  • 常见的几个断言方法
    在这里插入图片描述
  • eg:Python_unitest/test_7.py
# -*-coding:utf-8-*-

# 打开浏览器,获取title进行断言操作
import unittest
from selenium import webdriver

class Test(unittest.TestCase):
    def setUp(self) -> None:
        #启动谷歌浏览器
        self.driver = webdriver.Chrome()
        ##打开百度
        self.driver.get("http://www.baidu.com")
        ##获取title
        self.title = self.driver.title
        print(self.title)
        return self.title

    def test1(self):
        self.assertEqual(self.setUp(), '百度一下')



if __name__ == '__main__':
    unittest.main()

7.功能测试用例与Unittest

  • Execel用例编写模板
    在这里插入图片描述

  • ddt:Data Driven Testing数据驱动,即:测试数据的参数化
    ddt是第三方库,通过pipi install ddt下载;
    主要用到:data,unpack,file_data;
    装饰器:格式:@装饰名

  • 常见数据驱动方式
    ddt:yaml,excel,xmind,mysql(表中一条就代表一个用例);
    工作场景:去读取文件中,获取所有数据;再用ddt *,unpack解析成具体的用例;

  • ddt简介:DDT包含类的装饰器ddt,方法装饰器data
    ddt.ddt:装饰类,用于unittest.TestCase子类的类装饰器;
    ddt.data(value):添加到unittest.TestCase测试用例上的方法装饰器,作用:专门给测试用例导入数据的,value是直接操作的数据;
    @data(a,b)那么a和b各自作为参数使用,各运行一次用例,共执行2次用例;
    @data([a,b],[c,d]),那么[a,b]当成一个参数传入用例运行,共执行2次用例;
    ddt.unpack:传递的是复杂的数据结构时使用,主要用于拆分数据。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表中的值拆分成多个值,以此传给多个参数接收;

  • eg:Python_unitest/test_8.py

# -*-coding:utf-8-*-

'''
unittest
测试用例-TestCase
    规则:一个用例就是一个函数,函数名必须以test开头

测试集
测试报告
测试环境处理

'''
import unittest
from selenium import webdriver
import time
from ddt import ddt,data,unpack
from read_data import read_data

@ddt
class Test(unittest.TestCase):
    # userlist = [('useer1','passwd1'), ('useer2','passwd2')]
    ##环境数据
    def setUp(self):
        #启动谷歌浏览器
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(10)
        ##打开网址
        self.driver.get("http://ww.wangji.com")

    def tearDown(self) -> None:
        ##关闭浏览器
        time.sleep(3)
        self.driver.quit()

    def test01(self):
        '''test1'''
        ##找到用户名,输入值
        self.driver.find_element_by_name('accounts').send_keys('66')
        #找到密码,输入值
        self.driver.find_element_by_name('pwd').send_keys('11')
        ##点击登录按钮
        self.driver.find_element_by_xpath('/html/body/wangji').click()
        ##断言:预期结果
        exp_url = 'http://www.jiji.com'
        act_url = self.driver.current_url
        self.assertEqual(exp_url, act_url, msg='不一致')

    def test02(self):
        '''test2'''
        self.driver.find_element_by_name('accounts').send_keys('666')
        self.driver.find_element_by_name('pwd').send_keys('1111')
        self.driver.find_element_by_xpath('/html/body/wangji').click()
        exp_url = 'http://www.jiji.com'
        act_url = self.driver.current_url
        self.assertEqual(exp_url, act_url, msg='不一致')
    
    @data(*[('useer1','passwd1'), ('useer2','passwd2')]) ##*表示解包
    # @data([('useer1','passwd1'), ('useer2','passwd2')]) 区别是:@unpack中,会输出('useer1','passwd1')
    #1.拆分:('useer1','passwd1')和('useer2','passwd2')
    @unpack
    #2.拆分:useer1和passwd1
    def test03(self, username, pwd):
        ##10条测试用例:变量方式存储(user1,pwd1) (user2,pwd2)
        ##100条测试用例:文本存储excel,txt,yaml
        self.driver.find_element_by_name('accounts').send_keys(username)
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_xpath('/html/body/wangji').click()
        exp_url = 'http://www.jiji.com'
        act_url = self.driver.current_url
        self.assertEqual(exp_url, act_url, msg='不一致')

    ##excel传入到ddt
    @data(*read_data('login_data.xlsx'))
    @unpack
    def test04(self, username, pwd):
        self.driver.find_element_by_name('accounts').send_keys(username)
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_xpath('/html/body/wangji').click()
        exp_url = 'http://www.jiji.com'
        act_url = self.driver.current_url
        self.assertEqual(exp_url, act_url, msg='不一致')

        
if __name__ == '__main__':
    unittest.main()

在这里插入图片描述

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章           查看所有文章
加:2021-09-29 10:36:19  更:2021-09-29 10:38:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:26:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码