httprunner3 case结构及关键字详解

以login_test.py登录接口为例:

from httprunner import HttpRunner, Config, Step, RunRequest
class TestCaseLogin(HttpRunner):
    config = Config('hrun3_demo').base_url('http://xxx:80').export(*['vars_name'])

    teststeps = [
        Step(
            RunRequest('login')
            .post('/xxx/login.html')
            .with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
            .with_data({'accounts':'ss','pwd':'123456'})
        .extract()
            .with_jmespath('body.msg','value_msg')
        .validate()
            .assert_equal('body.msg','登录成功')
            .assert_equal('body.code',0)
        )
    ]

if __name__ == '__main__':
    TestCaseLogin().test_start()

模块引用

每个 case 文件必须要有的
from httprunner import HttpRunner, Config, Step, RunRequest

父类HttpRunner

每个 testcase都是HttpRunner的子类,在类名后面必须写HttpRunner
class TestCaseLogin(HttpRunner):

类属性

每个 testcase必须要有两个类属性config teststeps

一.config

配置测试用例级别的设置
config = Config('hrun3_demo')

.name(必填)
指定测试用例名称。这将显示在执行日志和测试报告中。

.base_url(可选)
指定SUT的通用架构和主机部分,例如https://postman-echo.com。如果base_url指定,则teststep中的url只能设置相对路径部分。如果要在不同的SUT环境之间切换,这将特别有用。

.variables(可选)
指定测试用例的公共变量。每个测试步骤都可以引用未在步骤变量中设置的配置变量。换句话说,步骤变量比配置变量具有更高的优先级。

.verify (可选)
指定是否验证服务器的TLS证书。如果我们想记录测试用例执行的HTTP流量,这将特别有用,因为如果没有设置verify或将其设置为True,则会发生SSLError。

SSLError(SSLCertVerificationError(1,'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:证书链中的自签名证书(_ssl.c:1076)')

.export (可选)
指定导出的测试用例会话变量。将每个测试用例视为一个黑盒,config variables是输入部分,而config export是输出部分。特别是,当一个测试用例在另一个测试用例的步骤中被引用,并且将被提取一些会话变量以在后续测试步骤中使用时,则提取的会话变量应在配置export部分中进行配置。将测试用例的某些变量指定为全局变量。(PS:不配置export在另一个引用类中进行该累的变量调用时,直接export也是可以的,最好还是配置一下)

二. teststeps

teststeps 下有两种情况RunRequest和RunTestCase

teststeps = [
        Step(
            RunTestCase('引用登录 login_test')
            .call(TestCaseLogin)
            .export(*['value_msg'])
        ),
        Step(
            RunRequest('加入购物车')
            .post('/xxxt/save.html')
            .with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
            .with_data({'goods_id': '5', 'stock': "1"})
        .extract()
            .with_jmespath('body','value_msg')
        .validate()
            .assert_equal('body.msg','加入成功')
            .assert_equal('body.code',0)
        )
1.RunRequest

RunRequest 在一个步骤中用于向API发出请求,并对响应进行一些提取或验证。

.name
RunRequest 的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。

.with_variables
指定测试步骤变量。每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,则应在配置变量中定义变量。此外,步骤变量将覆盖配置变量中具有相同名称的变量。(PS:注意参数传递的格式使用**{},使用关键字参数解包的方式进行参数传递给with_variables),参数引用使用"$变量名",如果是函数引用使用"${函数名()}"

method(url)
指定HTTP方法和SUT的URL。这些对应于method和url参数requests.request
如果base_url在config中设置,则url只能设置相对路径部分。如果在Config中设置了baseurl,method中只能设置相对路径,可选参数为get/post/put/delete/等。
如.post('http:xxx/login.html')

.with_params
指定请求网址的查询字符串。这对应于的params参数requests.request

.with_headers
为请求指定HTTP标头。这对应于的headers参数requests.request

.with_cookies
指定HTTP请求cookie。这对应于的cookies参数requests.request

.with_data
指定HTTP请求正文。这对应于的data参数requests.request

.with_json
在json中指定HTTP请求正文。这对应于的json参数requests.request

.extract()(数据提取)

.with_jmespath
使用jmespath提取JSON响应主体。
with_jmespath(jmes_path:文字,var_name:文字)

  • jmes_path:jmespath表达式,有关更多详细信息,请参考JMESPath教程
  • var_name:存储提取值的变量名,可以在后续测试步骤中引用它
.validate()

.assert_xxx
使用jmespath提取JSON响应主体并使用期望值进行验证。
assert_XXX(jmes_path:文本,期望值:任何,消息:文本=“”)

2.RunTestCase(名称)

RunTestCase 在一个步骤中用于引用另一个测试用例调用。

teststeps = [
        Step(
            RunTestCase('关联 login_test')
            .call(TestCaseLogin)# 引用TestCaseLogin
            .export(*['value_msg'])
        )
        Step(
      )]

.name
RunTestCase 的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。

.with_variables
指定测试步骤变量。每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,则应在配置变量中定义变量。此外,步骤变量将覆盖配置变量中具有相同名称的变量。

.call
指定引用的测试用例类。你在引用另一个测试用例的step中的参数时,需要先指定引用的测试用例类

.export
指定会话变量名称以从引用的测试用例中导出。导出的变量可以通过后续测试步骤step进行引用。导出的是step中的jmespath提取的变量,export之后,这个变量是全局变量,但是不能再confg中进行设置,因为测试类的引用是在step中进行的,而类的初始化是先初始化config,然后初始化teststeps,所以参数的传递在step之间

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容