本文我们将会讲解Python Unittest 里组织用例的5种姿势。



环境准备:

python 3.0以上

python requests库



小编的环境:

python 3.6.4

一、TestLoader

  • 当 import unittest 时 ,会自动导入TestLoader类
  • TestLoader这个类下,封装了 5 种组织用例的方法

loader.py

class TestLoader(object):
"""
该类负责根据各种标准加载测试并将它们包装在TestSuite中
""" def loadTestsFromTestCase(self, testCaseClass):
"""
返回testCaseClass中包含的所有测试用例的套件
""" def loadTestsFromModule(self, module, *args, pattern=None, **kws):
"""
返回给定模块中包含的所有测试用例的套件
""" def loadTestsFromName(self, name, module=None):
"""
返回给定用例名的测试用例的套件 """ def loadTestsFromNames(self, names, module=None):
"""
返回给定的一组用例名的测试用例的套件
""" def discover(self, start_dir, pattern='test*.py', top_level_dir=None):
"""
查找并返回指定的起始目录中的所有测试模块,递归到子目录中以查找它们并返回在其
中找到的所有测试。仅加载与模式匹配的测试文件。
必须可以从项目的顶层导入测试模块。如果起始目录不是顶级目录,则必须单独指定顶级目录。
""" defaultTestLoader = TestLoader()
"""
当执行 import unittest 时
会自动导入 defaultTestLoader
defaultTestLoader是TestLoader()的实例对象
"""

### 二、unittest组织用例方法演示
#### 项目目录
```
how_to_run_test_case
test_case
__init__.py
test_add.py
test_sub.py
run_from_test_case_class.py
run_from_test_case_moudle.py
run_from_case_name.py
run_from_case_names.py
run_from_discover.py
```

test_add.py

# encoding:utf8

import unittest

class AddCase(unittest.TestCase):

    def add_fun(self, a, b):

        return a + b
def test_add_1(self):
'''加法冒烟测试'''
ret = self.add_fun(1, 2)
self.assertEqual(3, ret) def test_add_2(self):
ret = self.add_fun(1, 2)
self.assertEqual(6, ret)

test_sub.py

# encoding:utf8

import unittest

class SubCase(unittest.TestCase):

    def add_fun(self, a, b):
return a - b def test_sub_1(self):
'''减法冒烟测试'''
ret = self.add_fun(1, 2)
self.assertEqual(-1, ret) def test_sub_2(self):
ret = self.add_fun(1, 2)
self.assertEqual(6, ret)

### 1、加载测试类中的用例
```
loadTestsFromTestCase(self, testCaseClass)
```
- 使用loadTestsFromTestCase这个方法,需传入unittest测试类的类名
- 以项目为例子,传入 testCaseClass :AddCase

例子:

run_from_test_case_class.py

# encoding:utf8

import unittest
from test_case.test_add import AddCase cases = unittest.TestLoader().loadTestsFromTestCase(AddCase)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

1.1 运行 run_from_test_case_class.py

python run_from_test_case_class.py

1.2 运行结果

test_add_1 (test_case.test_add.AddCase)
加法冒烟测试 ... ok
test_add_2 (test_case.test_add.AddCase) ... FAIL

### 2、加载模块中的测试用例
```
loadTestsFromModule(self, module, *args, pattern=None, **kws)
```
- 使用loadTestsFromModule这个方法,需传入被测试模块
- 以项目为例子,传入参数 module :test_add

例子:

run_from_test_case_moudle.py

# encoding:utf8

import unittest
from test_case import test_add cases = unittest.TestLoader().loadTestsFromModule(test_add)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

2.1 运行 run_from_test_case_moudle.py

python run_from_test_case_moudle.py

2.2 运行结果

test_add_1 (test_case.test_add.AddCase)
加法冒烟测试 ... ok
test_add_2 (test_case.test_add.AddCase) ... FAIL

### 3、加载指定的单个测试用例
```
loadTestsFromName(self, name, module=None)
```
- 使用loadTestsFromName这个方法,需传入测试用例的方法名
- 传入测试用例的方法名格式:moudleName.testCaseClassName.testCaseName
- 以项目为例子,我想测试test_add.py 里面的用例 test_add_1
- 我需要传入的参数 name:test_add.AddCase.test_add_1
- loadTestsFromName这个方法是在 sys.path 里面的路径去寻找测试模块test_add.py,然后再寻找测试类AddCase
最后再寻找测试用例test_add_1

例子:

run_from_case_name.py

# encoding:utf8

import unittest
import os
import sys # 获取 "how_to_run_test_case" 的绝对路径
dir_run_test_case = os.path.dirname(os.path.abspath(__file__))
# 获取 "test_case" 的绝对路径
dir_test_case = dir_run_test_case + '/test_case'
# 把 "test_case" 的绝对路径 加入 sys.path
sys.path.insert(0,dir_test_case) case= unittest.TestLoader().loadTestsFromName('test_add.AddCase.test_add_1')
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

3.1 运行 run_from_case_name.py

python run_from_case_name.py

3.2 运行结果

test_add_1 (test_add.AddCase)
加法冒烟测试 ... ok

### 4、加载指定的多个测试用例
```
loadTestsFromNames(self, names, module=None)
```
- 使用loadTestsFromNames这个方法,需要传入一个数组
- 数组里面里面的元素必须是字符串
- 数组元素可以是模块、类、方法
- 数组元素 - 传入格式1:moudleName
- 数组元素 - 传入格式2:moudleName.testCaseClassName
- 数组元素 - 传入格式3:moudleName.testCaseClassName.testCaseName
- 以项目为例,我想测试test_add.py 里面的用例 test_add_1 ,以及test_sub.py 里面的用例 test_sub_1
- 我需要传入的参数 names:['test_sub.SubCase.test_sub_2','test_add.AddCase.test_add_1']
- loadTestsFromNames这个方法是在 sys.path 里面的路径去寻找匹配的测试用例
- 执行用例是根据数组元素的的顺序执行

例子:

run_from_case_names.py

# encoding:utf8

import unittest
import sys
import os # 获取 "how_to_run_test_case" 的绝对路径
dir_run_test_case = os.path.dirname(os.path.abspath(__file__))
# 获取 "test_case" 的绝对路径
dir_test_case = dir_run_test_case + '/test_case'
# 把 "test_case" 的绝对路径 加入 sys.path
sys.path.insert(0,dir_test_case) cases = ['test_sub.SubCase.test_sub_1','test_add.AddCase.test_add_1']
suite = unittest.TestLoader().loadTestsFromNames(cases)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

4.1 运行 run_from_case_names.py

python run_from_case_names.py

4.2 运行结果

test_sub_1 (test_sub.SubCase)
减法冒烟测试 ... ok
test_add_1 (test_add.AddCase)
加法冒烟测试 ... ok

### 5、加载指定目录下所有的测试用例
```
discover(self, start_dir, pattern='test*.py', top_level_dir=None)
```
- start_dir : 查找用例的起始目录
- pattern='test*py' : 查找模块名为test开头的python文件
- top_level_dir=None :测试模块顶级目录

例子:

run_from_discover.py

# encoding:utf8

import unittest
import os dir_how_to_run_test_case = os.path.dirname(os.path.abspath(__file__))
dir_test_case = dir_how_to_run_test_case + '/test_case' cases = unittest.defaultTestLoader.discover(dir_test_case)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

5.1 运行 run_from_discover.py

python run_from_discover.py

5.2 运行结果

test_add_1 (test_add.AddCase)
加法冒烟测试 ... ok
test_add_2 (test_add.AddCase) ... FAIL
test_sub_1 (test_sub.SubCase)
减法冒烟测试 ... ok
test_sub_2 (test_sub.SubCase) ... FAIL

### 6、 Github 源码地址: [https://github.com/SEtester/how_to_run_test_case](https://github.com/SEtester/how_to_run_test_case)

Unittest组织用例的姿势的更多相关文章

  1. python+unittest 控制用例的执行顺序

    unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.所以可能执行的顺序和你想要的顺序不一样,可能通过下面两种方法修改执行顺序 1. 通过Test ...

  2. python 接口自动化测试(六)使用unittest 批量用例管理

    我们日常项目中的接口测试案例肯定不止一个,当案例越来越多时我们如何管理这些批量案例?如何保证案例不重复?如果案例非常多(成百上千,甚至更多)时如何保证案例执行的效率?如何做(批量)测试数据的管理?如何 ...

  3. python接口自动化测试十六:unittest完成用例

    import unittestimport requests def add(a, b): print('前置条件!!!!!:如登录') return a + b class TestAAA(unit ...

  4. python+selenium 组织用例方式 总结

    1.unittest.main() 将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们.执行 ...

  5. unittest执行用例方法

    #coding=utf-8 from selenium import webdriver from time import sleep import unittest#导入unittest库 impo ...

  6. unittest管理用例生成测试报告

    #登录方法的封装 from appium import webdriver from time import sleep from python_selenium.Slide import swipe ...

  7. unittest 管理用例生成测试报告

    # 登录方法的封装 from appium import webdriver from time import sleep from python_selenium.Slide import swip ...

  8. python unittest控制用例的执行顺序

    为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...

  9. python selenium-5根据unittest组织测试用例

    driver:浏览器driver存放地址 testcase:测试用例目录 report:测试结果保存目录 runtest.py:执行文件 test_search1.py搜索selenium,test_ ...

随机推荐

  1. 洛谷【P1303】A*B Problem

    题目传送门:https://www.luogu.org/problemnew/show/P1303 高精度乘法板子题,灵性地回忆一下小学时期列竖式的草稿纸即可. 时间复杂度:\(O(len^2)\) ...

  2. cookie与web Storage

    一.cookie 1. http头与cookie cookie是HTTP Cookie的简称.该标准要求: (1)服务器的HTTP响应头包含 Set-Cookie字段 响应头Eg: HTTP/1.1 ...

  3. POJ 1664 放苹果(递归或DP)

    一.Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t ...

  4. POJ2689:素数区间筛选

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15820   Accepted: 4202 D ...

  5. Python:struct模块的pack、unpack

    mport struct pack.unpack.pack_into.unpack_from 1 # ref: http://blog.csdn<a href="http://lib. ...

  6. nginx实现带参数目录域名重定向二级域名方法

    本文章介绍了关于nginx实现带参数目录域名重定向二级域名方法,有需要学习的朋友可参考一下. 下面的代码是基于nginx的子目录301到其他域名(URL)的规则.作用是例如访问http://www.p ...

  7. web攻击之八:溢出攻击(nginx服务器防sql注入/溢出攻击/spam及禁User-agents)

    一.什么是溢出攻击 首先, 溢出,通俗的讲就是意外数据的重新写入,就像装满了水的水桶,继续装水就会溢出,而溢出攻击就是,攻击者可以控制溢出的代码,如果程序的对象是内核级别的,如dll.sys文件等,就 ...

  8. IPC编程之消息队列

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面3类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3.共享内存(匿名的和具名的) ...

  9. C#笔记(二)

    转换操作符:操作符重载,可自定义实现从一种类型到另一种类型的显示或者隐式转换 : true/false也可进行操作符重载: LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不 ...

  10. 2、Tophat align_summary.txt and samtools flagstat accepted_hits.bam disagree

    ###https://www.biostars.org/p/195758/ Left reads: Input : 49801387 Mapped : 46258301 (92.9% of input ...