自动化冒烟测试 Unittest , Pytest 哪家强?
前言:之前有一段时间一直用 Python Uittest做自动化测试,觉得Uittest组织冒烟用例比较繁琐,后来康哥提示我使用pytest.mark来组织冒烟用例
本文讲述以下几个内容:
1、Unittest 如何组织冒烟用例
2、Pytest 组织冒烟测试
3、Pytest 执行unittest冒烟用例
环境准备:
Python 3.64
Pytest 5.01
项目目录:
smoke_testing_demo
        test_case
            __init__.py
            test_case_with_unittest.py
            test_case_with_pytest.py
        run_unittest_smoke_testing.py
一、Unittest如何组织冒烟用例
- 当 import unittest 时 ,会自动导入TestLoader类
 - TestLoader这个类下,封装了 5 种组织用例的方法
 - 本文主要讲解 loadTestsFromNames
 - 更多Uittest组织用例方法可参考《Unittest组织用例的姿势》这篇博文,链接在文末
 
loadTestsFromNames 方法简介
$ loader.py 该文件在python3.7已不存在,建议使用python3.64 查看使用方法
class TestLoader(object):
    """
    该类负责根据各种标准加载测试并将它们包装在TestSuite中
    """
    def loadTestsFromNames(self, names, module=None):
    """
    返回给定的一组用例名的测试用例的套件
    """
loadTestsFromNames 组织冒烟用例
测试用例
$ test_case_with_unittest.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
class TestUittestCase(unittest.TestCase):
    def test_case_with_unittest_1(self):
        '''冒烟测试用例'''
        print('I am Smoke Testing ')
    def test_case_with_unittest_2(self):
        pass
if __name__ == '__main__':
    unittest.main(verbosity=2)
$ test_case_with_unittest2.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
class TestUittestCase2(unittest.TestCase):
    def test_case_with_unittest_3(self):
        '''冒烟测试用例'''
        print('I am Smoke Testing ')
    def test_case_with_unittest_4(self):
        pass
if __name__ == '__main__':
    unittest.main(verbosity=2)
冒烟测试用例集
$ run_unittest_smoke_testing.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
cases = [
    'test_case.test_case_with_unittest2.TestUittestCase2.test_case_with_unittest_3',
    'test_case.test_case_with_unittest.TestUittestCase.test_case_with_unittest_1'
]
test_suit = unittest.TestLoader().loadTestsFromNames(cases)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(test_suit)
运行结果
test_case_with_unittest_3 (test_case.test_case_with_unittest2.TestUittestCase2)
冒烟测试 ... ok
test_case_with_unittest_1 (test_case.test_case_with_unittest.TestUittestCase)
冒烟测试 ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
小结:
- 通过loadTestsFromNames 可以从不同的模块组织特定的用例集
 - 使用loadTestsFromNames这个方法,需要传入一个数组
 - 数组里面里面的元素必须是字符串
 - 数组元素传入格式:'moudleName.testCaseClassName.testCaseName'
 - 执行用例是根据数组元素的的顺序执行
 
ps: 更多通过loadTestsFromNames 使用技巧,
可以查看《Unittest组织用例的姿势》这篇博文,链接在文末
二、Pytest 组织冒烟测试
- pytest 提供了测试用例标记机制
 - 一个测试用例允许被多个@pytest.mark进行标记
 - 同一个@pytest.mark可以标记多个测试用例
 - pytest.mark常用于冒烟测试用例组织
 
ps:更多的pytest.mark用法可以参考乙醇老师《安利一下pytest的mark用法》
pytest.mark 组织冒烟用例
测试用例
$ run_unittest_smoke_testing.py
#!/usr/bin/env python3
# encoding:utf-8
import pytest
@pytest.mark.test_env
def test_case_1():
    pass
@pytest.mark.test_env
@pytest.mark.smoke
def test_case_2():
    ''' 冒烟用例'''
    pass
cd 进入 /test_case目录,
使用命令行运行 test_case_with_pytest.py
pytest test_case_with_pytest.py -v -m smoke
运行结果
collected 2 items
test_case_with_pytest.py::test_case_2 PASSED
============================== 1 tests deselected ==============================
==================== 1 passed, 1 deselected in 0.01 seconds ====================
运行被标记test_env的用例
pytest test_case_with_pytest.py -v -m test_env
运行结果
collected 2 items
test_case_with_pytest.py::test_case_1 PASSED
test_case_with_pytest.py::test_case_2 PASSED
=========================== 2 passed in 0.01 seconds ===========================
三、Pytest 执行 Unittest冒烟用例
Pytest测试框架是兼容Python自带的Unittest
修改test_case_with_unittest2.py
$ test_case_with_unittest2.py
#!/usr/bin/env python3
# encoding:utf-8
import unittest
import pytest
class TestUittestCase2(unittest.TestCase):
    @pytest.mark.smoke
    def test_case_with_unittest_3(self):
        '''冒烟测试用例'''
        print('I am Smoke Testing ')
    def test_case_with_unittest_4(self):
        pass
if __name__ == '__main__':
    unittest.main(verbosity=2)
命令行运行 test_case_with_unittest2.py
pytest test_case_with_unittest2.py -v -m smoke
运行结果
collected 2 items / 1 deselected / 1 selected
test_case_with_unittest2.py::TestUittestCase2::test_case_with_unittest_3 PASSED [100%]
============== 1 passed, 1 deselected, 1 warnings in 0.01 seconds ==============
总结:
1、Uittest组织冒烟用例,需通过loadTestsFromNames在不同的测试模块里指定测试用例,组装成test suit(测试套件)后,给TextTestRunner运行
2、Pytest组织冒烟用例,只需给测试用例加上@pytest.mark.key ,使用命令行pytest -m key test_case.py 即可
自动化冒烟测试 Unittest , Pytest 哪家强?
笔者个人见解:
使用Uittest组织冒烟测试,关注点有至少有两个
1、当编写新功能的冒烟测试,需要去维护冒烟测试用例集
2、合并代码时,如果有两个人同时修改了这个冒烟用例集,还要解决冲突,防止遗漏冒烟用例使用Pytest组织冒烟测试,关注点在于用例的本身
当编写新功能的冒烟测试,我只需在给用例加一个编写用例人员约定好的@pytest.mark,例如@pytest.mark.smoke
推荐阅读:
《Python Unittest - 根据不同测试环境跳过用例详解》
源码地址:
https://github.com/SEtester/smoke_testing_demo
最后,欢迎同学们留言, 你认为自动化冒烟测试 Unittest , Pytest 哪家强?
文章如有不是,欢迎同学们斧正
自动化冒烟测试 Unittest , Pytest 哪家强?的更多相关文章
- [转]Python测试框架对比----unittest, pytest, nose, robot framework对比
		
测试框架 什么是框架? 框架(Framework)是整个或部分系统的可重用设计,框架是用来解决代码的组织及运行控制问题的. 在我们编写自动化脚本的时候,经常需要读取配置文件,读取数据文件,发送请求 ...
 - Python测试框架对比----unittest, pytest, nose, robot framework对比
		
什么是框架? 框架(Framework)是整个或部分系统的可重用设计, 框架是用来解决代码的组织及运行控制问题的. 在我们编写自动化脚本的时候,经常需要读取配置文件,读取数据文件,发送请求,记录日志, ...
 - PAT 1032 挖掘机技术哪家强(20)(有测试样例)
		
1032 挖掘机技术哪家强(20)(20 分) 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过10 ...
 - python测试框架-pytest
		
一.pytest 介绍.运行.参数化和数据驱动.Fixture pytest安装与介绍 官网 : pip install -U pytest 查看版本号:pytest --version 为何选择py ...
 - 可能是 Python 中最火的第三方开源测试框架 pytest
		
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
 - Python最火的第三方开源测试框架 ——pytest
		
一.介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest.它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了) 自 ...
 - 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本
		
某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...
 - 冒烟测试 smoking test
		
冒烟测试的概念: 版权声明:本文为博主原创文章,未经博主允许不得转载. 冒烟测试既是对软件基本的功能进行测试,测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基本的功能正常,保证软件系 ...
 - 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
		
Web登录测试是很常见的测试!手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文作者就用python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动 ...
 
随机推荐
- typescript Json Convert
			
关键代码 this.data={}; // json string this.dataStr=JSON.stringify(this.data); // json object this.conver ...
 - debian kill 进程等命令
			
netstat -antup 查看所有进程 譬如Firefox现在僵死,无法相应请求.打开一个终端,输入: pgrep firefox 会返回数值,譬如是7198.现在输入: kill 7198 ...
 - You don't have permission to access / on this server问题的解决.
			
vhosts.conf配置文件中虚拟主机的配置如下,Options Indexes FollowSymLinks 后面添加 ExecCGI <VirtualHost 192.168.10.82: ...
 - HTTP协议-请求报文
 - NSLocalizedDescription=Request failed: unacceptable content-type: text/html 解决方法
			
使用AFNetworking请求一个网站出现了以下错误 Error Domain=com.alamofire.error.serialization.response Code=- "Req ...
 - Win8 Metro(C#)数字图像处理--3.3图像直方图计算
			
原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...
 - .NET MVC 在action中,过滤器中,或视图中,如何分别获取 当前请求的 控制器/视图/区域 的名字
			
1)过滤器中的: public class CMSAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthoriza ...
 - SGI地址模式: O32, N32和N64
			
背景 MIPS R10000芯片支持MIPS ABI.遵循这一标准的程序能够运行在遵循这一标准的任何处理器/系统上.目前,主要的支持者有SGI,西门子,Nixdof, Tandem, Pyramid, ...
 - 装了VS2005再装IIS,结果出了些小问题 访问IIS元数据库失败
			
版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.42 装了VS2005再装IIS,结果出了些小问题访问IIS元 ...
 - FastMM、FastCode、FastMove的使用(详细讲解了怎么安装与使用)good
			
http://blog.csdn.net/akof1314/article/details/6524767