Pytest之命令行执行

2020-05-29 10:50:38 浏览数 (1)

基于SAAS化的架构下,特别是面对to B类型的产品,那么测试经常面对的就是如何来测试每个上层应用。其实在底层微服务共享的模式下,更多的关注底层的微服务的测试,而对于上层应用来说,只需要随机的选择一个使用产品活跃度高的用户来进行测试就可以了,从这个架构的模式下这样的测试思路是没有问题的,而且也是成立的。但是随着业务的扩张,就会有很多的集群,每个集群都是需要被测试和验证(后续在文章中详细的介绍SAAS化集群的容量规划,调度,计算和存储的验证思路),考虑到每个集群都是需要被验证,那么测试代码只有一套,不可能说面对多个集群而有多套代码,这样从成本来说它是非常不合理的。

基于一套代码,实现流水线的验证方案,针对每个流水线传不同的用户进行验证,具体的用户可以选择每个集群里面活跃度比较高用户来进行测试。正如前面说的,在SAAS化的模式下,底层服务它是共享的机制,但是每个集群它是不同的,这种不同在于它提供的DB层面和计算能力,因此需要被验证。使用Pyhton中的argparse可以实现与Jenkins中的参数化关联起来,这样建立一种机制后,我们只需要在参数化里面定义我们需要被验证的点来进行测试。如下代码:

代码语言:javascript复制
#!/usr/bin/env python
#!coding:utf-8
import argparse
import  sys
import  json
import  requests
import pytest

def getHeaders():
   return {'Content-Type':'application/json ;charset=utf-8'}

def ciParameterize():
   '''结合CI系统形成参数化的构建,这个地方关联的是Jenkins参数化,是不能修改的'''
   parser=argparse.ArgumentParser()
   parser.add_argument('param')
   args=parser.parse_args()
   param=vars(args)
   v=dict()
   for key,value  in param.items():
      v[key]=value
   return v['param']

def sendHello():
   url='https://oapi.dingtalk.com/robot/send?access_token=00fe14445a5e307f2ff0914b1d3de083a390b3058d62c27ed50561298198bf9b'
   msg=ciParameterize() '为您服务!'
   String_textMsg = {
      "msgtype": "text",
      "text": {"content": msg},
      "at": {"atMobiles": ["134****5195"],"isAtAll": 0}}
   String_textMsg=json.dumps(String_textMsg)
   r = requests.post(url, data=String_textMsg, headers=getHeaders())
   return r

if __name__ == '__main__':
   sendHello()

这样结合Jenkins的参数化后,可以指定具体的用户来进行问好,如“无涯课堂为您服务!”或者说“XX为您服务!”,总的来说,这样指定的用户它是基于我们实际测试中可以随意指定的,而不需要单独的把它写死,因为写死是一种最差的解决方案。结合CI的参数化如下图所示:

然后在具体执行的层面直接调用param这个参数可以了,如下图所示:

这样构建的时候可以指定具体的参数来进行如下,如下图所示:

这样可以依据自己的业务需求,指定需要的用户进行执行,可以很轻松的和CI的参数化之间建立关系然后整合起来。

如果和Pytest整合起来后,我们会发现,如上的方式执行的时候,总是会提示错误的信息,这是因为在Pytest的测试框架中,它是有它自己内部的一套机制,我们可以结合它内部的命令行执行和Ci的参数化来进行整合,从而达到刚才的目的。创建conftest.py的文件,在里面添加命令行执行参数的代码:

代码语言:javascript复制
#!/usr/bin/env python
#!coding:utf-8
import pytest
import argparse

def pytest_addoption(parser):
   '''添加pytest的自定义命令行参数'''
   parser.addoption(
      '--cmdopt',action='store',default='无涯课堂',help='myoption: type1 or pyte2'
   )

@pytest.fixture()
def getUser(request):
   '''参数处理成fixture'''
   return request.config.getoption('--cmdopt')

然后把模块名称修改为test_开头的模块名称,模块里面的源代码具体为:

代码语言:javascript复制
#!/usr/bin/env python
#!coding:utf-8
import argparse
import  sys
import  json
import  requests
import pytest

def getHeaders():
   return {'Content-Type':'application/json ;charset=utf-8'}

def test_sendHello(getUser):
   url='https://oapi.dingtalk.com/robot/send?access_token=00fe14445a5e307f2ff0914b1d3de083a390b3058d62c27ed50561298198bf9b'
   msg=getUser '为您服务!'
   String_textMsg = {
      "msgtype": "text",
      "text": {"content": msg},
      "at": {"atMobiles": ["134****5195"],"isAtAll": 0}}
   String_textMsg=json.dumps(String_textMsg)
   r = requests.post(url, data=String_textMsg, headers=getHeaders())
   return r

if __name__ == '__main__':
   pytest.main(["-s","-v","test_params.py"])

在CI中,修改执行的方式,具体如下:

这样修改后,可以很完美的把Pytest框架的命令行参数与Ci的参数整合起来,从而得到在SAAS化的架构下,对各个上层应用不同账户的验证,来达到校验各个集群的目的。

0 人点赞