## 前言
场景:随着项目越来越大、复杂,用例越来越多,串行的执行就需要太多的时间,就像测试部门一样,项目太多,项目完成的时间就越来越久,这就需要我们招聘更多的人,同时来测试项目,这样就提高了测试效率,但是需要尽量减少项目测试之
间的关联性、耦合性。
Pytest 框架提供了
一个`pytest-x
dist`
插件帮我们做了这件事情,我们只需要简单的使用即可。
## **用例需要并发执行注意点**
- 每条用例是独立的,没有依赖关系,完全解耦,用例可以完全独立运行
- 用例执行没有顺序,
随机顺序都能正常执行
- 每个用例都能重复运行,运行结果不会影响其他用例
## pytest-x
dist 详解 (建议掌握程度:☆☆☆☆☆)
### 安装
- 在命令行窗口输入: `pip install pytest-x
dist`
- 查看安装版本:`pip show pytest-x
dist`

### 使用
使用
方法 :
- pytest -n num (代表使用num个
cpu)
- pytest -n auto
- n auto:可以
自动检测到系统的
cpu核数;从测试结果来看,检测到的是逻辑处理器的
数量
- 使用auto等于利用了所有
cpu来跑用例,此时
cpu占用率会特别高
说明:建议最多使用1/2的
cpu个数来进行执行,消耗资源太多,导致电脑太卡
**先看下不使用分布式执行**
```python
# !/usr/bin/
python3
# _*_coding:utf-8 _*_
""""
# @Time :2021/7/10 13:31
# @Author : king
# @File :test_x
dist.py
# @Software :PyCharm
# @blog :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import pytest
import time
def test_01():
time.sleep(1)
print("我是 test_01 用例")
assert True
def test_02():
time.sleep(1)
print("我是 test_02 用例")
assert True
def test_03():
time.sleep(1)
print("我是 test_03 用例")
assert True
def test_04():
time.sleep(1)
print("我是 test_04 用例")
assert True
def test_05():
time.sleep(1)
print("我是 test_05 用例")
assert True
def test_06():
time.sleep(1)
print("我是 test_06 用例")
assert True
def test_07():
time.sleep(1)
print("我是 test_07 用例")
assert True
def test_08():
time.sleep(1)
print("我是 test_08 用例")
assert True
def test_09():
time.sleep(1)
print("我是 test_09 用例")
assert True
def test_10():
time.sleep(1)
print("我是 test_10 用例")
assert True
def test_11():
time.sleep(1)
print("我是 test_11 用例")
assert True
def test_12():
time.sleep(1)
print("我是 test_12 用例")
assert True
if
__name__ == '__main__':
pytest.main(["-s", "-v"])
```
执行结果:
代码每个用例sleep了1秒,可以看出来串行需要12秒,如果是成千上万的用例,需要的时间就特别长了

**使用 pytest -n num**
示例还是上面示例,直接看执行结果:命令输入`pytest -n 3 test_x
dist.py`, 看执行时间是不是从12.20秒到4.75秒,是不是减少了2倍

**使用 pytest -n auto**
示例还是上面示例,直接看执行结果:命令输入`pytest -n auto test_x
dist.py`,启动了8个进程,代表执行电脑总共8个虚拟
cpu,因为用例不多,
加上启动进程需要时间,所以跟3个进行
消耗时间差不多,如果用例越多
效果越明显,建议使用1/2的电脑
cpu运行即可

### 看看多个
文件时执行情况
- `test_x
dist.py` 和 `test_x
dist_02.py` 和 `test_x
dist_03.py` 里面
代码 都是一样
- 使用`pytest -v -n 3 test_x
dist.py test_x
dist_02.py test_x
dist_03.py` 执行
执行结果:看结果是,先收集了所有用例,创建了3个执行器,分别执行对应的用例,3个执行器都是从第
一个文件往后依次执行

## **问题:如果按照作用域分配给worker用例分别执行该怎么做**
如果我们想要按照用例的作用域进行执行,该怎么处理呢?3个执行器只能分别执行
一个模块(
一个py
文件)或者同
一个文件里面同
一个类只给
一个执行器执行。
通过`pytest-x
dist`的源码发现有这一段参数配置说明:
```python
group.addoption(
"--
dist",
Metavar="
distmode",
action="store",
choices=["each", "load", "loads
cope", "loadfile", "no"],
dest="
dist",
default="no",
help=(
"set mode for
distributing tests to exec environments.\n\n"
"each: send each test to all available environments.\n\n"
"load: load balance by sending any pending test to any"
" available environment.\n\n"
"loads
cope: load balance by sending pending groups of tests in"
" the same s
cope to any available environment.\n\n"
"loadfile: load balance by sending test grouped by file"
" to any available environment.\n\n"
"(default) no: run tests inprocess, don't @R_
502_3435@."
),
```
**说明:**
- `--
dist=loads
cope` 将按照同
一个作用域
方法来分组,然后将每个测试组发给可以执行的worker,确保同
一个组的测试用例在同
一个进程中执行
- `--
dist=loadfile` 按照同
一个文件名来分组,然后将每个测试组发给可以执行的worker,确保同
一个组的测试用例在同
一个进程中执行
- `--
dist=each` 是将每个用例,分别发给所有的执行器worker,相当于开了几个执行器worker,同
一个用例就执行几遍
- `--
dist=load` 将待运行的用例
随机发给可用的执行器worker,用例执行顺序
随机的,目前
默认采用这种方式
### `--
dist=loadfile` 示例:
示例
代码还是上述
代码,执行命令:`pytest -v -n 3 --
dist=loadfile test_x
dist.py test_x
dist_02.py test_x
dist_03.py`

结果:从结果可以看下 `gw0` 执行 `test_x
dist.py` 模块, `gw1` 执行 `test_x
dist_02.py` 模块, `gw2` 执行 `test_x
dist_03.py` 模块
### `--
dist=loads
cope` 示例:
`test_x
dist.py` 示例
代码:
```python
# !/usr/bin/
python3
# _*_coding:utf-8 _*_
""""
# @Time :2021/7/10 13:31
# @Author : king
# @File :test_x
dist.py
# @Software :PyCharm
# @blog :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import pytest
import time
class Tes
tdist01:
def test_01(self):
time.sleep(1)
print("我是 test_01 用例")
assert True
def test_02(self):
time.sleep(1)
print("我是 test_02 用例")
assert True
def test_03(self):
time.sleep(1)
print("我是 test_03 用例")
assert True
class Tes
tdist02:
def test_04(self):
time.sleep(1)
print("我是 test_04 用例")
assert True
def test_05(self):
time.sleep(1)
print("我是 test_05 用例")
assert True
def test_06(self):
time.sleep(1)
print("我是 test_06 用例")
assert True
class Tes
tdist03:
def test_07(self):
time.sleep(1)
print("我是 test_07 用例")
assert True
def test_08(self):
time.sleep(1)
print("我是 test_08 用例")
assert True
def test_09(self):
time.sleep(1)
print("我是 test_09 用例")
assert True
class Tes
tdist04:
def test_10(self):
time.sleep(1)
print("我是 test_10 用例")
assert True
def test_11(self):
time.sleep(1)
print("我是 test_11 用例")
assert True
def test_12(self):
time.sleep(1)
print("我是 test_12 用例")
assert True
if
__name__ == '__main__':
pytest.main()
```
**执行结果**
执行命令:`pytest -v -n 3 --
dist=loads
cope test_x
dist.py`

结果:从结果可以看下 `gw0` 执行 `test_x
dist.py` 模块的 `Tes
tdist01` 和 `Tes
tdist04` 类, `gw1` 执行 `test_x
dist.py` 模块的`Tes
tdist01` 类, `gw2` 执行 `test_x
dist.py` 模块的 `Tes
tdist03`
### `--
dist=each` 示例:
与上述 `test_x
dist.py` 示例
代码一样,执行命令: `pytest -v -n 3 --
dist=each test_x
dist.py`

结果:从上面结果可以看出来,每天用例被执行了3遍
### `--
dist=load` 和 `--
dist==no` 示例:
- 略,前面最开始执行示例,
随机将待执行的用例分别给可用的执行器worker执行
## 总结
- 使用并行测试
加上` -n num` 或者 `-n auto` 参数即可使用
- 可以根据参数 `--
dist=loadfile`、 `--
dist=loads
cope`、`--
dist=each`、`--
dist=load` 和 `--
dist==no`设置不同的执行器worker执行模式
- 如果存在每条用例重复执行多次的场景,采用`--
dist=each`模式,开几个执行器worker就执行几次
以上为
内容纯属个人理解,如有不足,欢迎各位大神指正,转载请注明出处!
>**如果觉得
文章不错,欢迎关注微信公众号,微信公众号每天推送相关测试技术
文章**
个人微信号:
搜索 【测试之路笔记】
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。