Files
httprunner/development/dev-api/index.html
2019-11-02 00:07:31 +08:00

1280 lines
67 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="HttpRunner V2.x User Documentation">
<meta name="author" content="debugtalk">
<meta name="lang:clipboard.copy" content="复制">
<meta name="lang:clipboard.copied" content="已复制">
<meta name="lang:search.language" content="jp">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="没有找到符合条件的结果">
<meta name="lang:search.result.one" content="找到 1 个符合条件的结果">
<meta name="lang:search.result.other" content="# 个符合条件的结果">
<meta name="lang:search.tokenizer" content="[\uff0c\u3002]+">
<link rel="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-4.4.3">
<title>基础库调用 - HttpRunner V2.x 中文使用文档</title>
<link rel="stylesheet" href="../../assets/stylesheets/application.30686662.css">
<link rel="stylesheet" href="../../assets/stylesheets/application-palette.a8b3c06d.css">
<meta name="theme-color" content="#3f51b5">
<script src="../../assets/javascripts/modernizr.74668098.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono&display=fallback">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../../assets/fonts/material-icons.css">
<script>
window.ga = window.ga || function() {
(ga.q = ga.q || []).push(arguments)
}
ga.l = +new Date
/* Setup integration and send page view */
ga("create", "UA-114587036-2", "auto")
ga("set", "anonymizeIp", true)
ga("send", "pageview")
/* Register handler to log search on blur */
document.addEventListener("DOMContentLoaded", () => {
if (document.forms.search) {
var query = document.forms.search.query
query.addEventListener("blur", function() {
if (this.value) {
var path = document.location.pathname;
ga("send", "pageview", path + "?q=" + this.value)
}
})
}
})
</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
</head>
<body dir="ltr" data-md-color-primary="indigo" data-md-color-accent="indigo">
<svg class="md-svg">
<defs>
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="__github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="#_1" tabindex="1" class="md-skip">
跳转至
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="../.." title="HttpRunner V2.x 中文使用文档" class="md-header-nav__button md-logo">
<i class="md-icon"></i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
HttpRunner V2.x 中文使用文档
</span>
<span class="md-header-nav__topic">
基础库调用
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
键入以开始搜索
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://github.com/HttpRunner/HttpRunner" title="前往 Github 仓库" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#__github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
HttpRunner
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main" role="main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="../.." title="HttpRunner V2.x 中文使用文档" class="md-nav__button md-logo">
<i class="md-icon"></i>
</a>
HttpRunner V2.x 中文使用文档
</label>
<div class="md-nav__source">
<a href="https://github.com/HttpRunner/HttpRunner" title="前往 Github 仓库" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#__github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
HttpRunner
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." title="介绍" class="md-nav__link">
介绍
</a>
</li>
<li class="md-nav__item">
<a href="../../Installation/" title="安装说明" class="md-nav__link">
安装说明
</a>
</li>
<li class="md-nav__item">
<a href="../../quickstart/" title="快速上手" class="md-nav__link">
快速上手
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
基础概念
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-4">
基础概念
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../concept/nominal/" title="名词解释" class="md-nav__link">
名词解释
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
测试准备
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-5">
测试准备
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../prepare/record/" title="录制生成用例" class="md-nav__link">
录制生成用例
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/project-structure/" title="项目文件组织" class="md-nav__link">
项目文件组织
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/testcase-structure/" title="测试用例组织" class="md-nav__link">
测试用例组织
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/request-hook/" title="hook机制" class="md-nav__link">
hook机制
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/dot-env/" title="环境变量" class="md-nav__link">
环境变量
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/testcase-layer/" title="测试用例分层" class="md-nav__link">
测试用例分层
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/parameters/" title="参数化数据驱动" class="md-nav__link">
参数化数据驱动
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/validate-pretty/" title="Validate & Prettify" class="md-nav__link">
Validate & Prettify
</a>
</li>
<li class="md-nav__item">
<a href="../../prepare/security/" title="信息安全" class="md-nav__link">
信息安全
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
测试执行
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-6">
测试执行
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../run-tests/cli/" title="运行测试(CLI)" class="md-nav__link">
运行测试(CLI)
</a>
</li>
<li class="md-nav__item">
<a href="../../run-tests/report/" title="测试报告" class="md-nav__link">
测试报告
</a>
</li>
<li class="md-nav__item">
<a href="../../run-tests/load-test/" title="性能测试" class="md-nav__link">
性能测试
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7" checked>
<label class="md-nav__link" for="nav-7">
开发扩展
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-7">
开发扩展
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../architecture/" title="Pipline" class="md-nav__link">
Pipline
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
基础库调用
</label>
<a href="./" title="基础库调用" class="md-nav__link md-nav__link--active">
基础库调用
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">目录</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#httprunner-class" class="md-nav__link">
HttpRunner class
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
可用初始化参数
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
可用调用方法
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
可用属性
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
运行测试用例
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
传入测试用例文件路径
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
传入标准的测试用例结构体
</a>
</li>
<li class="md-nav__item">
<a href="#debugtalkpy-env" class="md-nav__link">
加载 debugtalk.py &amp;&amp; .env
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
返回详细测试结果数据
</a>
</li>
<li class="md-nav__item">
<a href="#html" class="md-nav__link">
生成 HTML 测试报告
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../FAQ/" title="FAQ" class="md-nav__link">
FAQ
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
<label class="md-nav__link" for="nav-9">
实践案例
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-9">
实践案例
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../examples/testerhome-login/" title="TesterHome 登录" class="md-nav__link">
TesterHome 登录
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../related-docs/" title="相关资料" class="md-nav__link">
相关资料
</a>
</li>
<li class="md-nav__item">
<a href="../../CHANGELOG/" title="CHANGELOG" class="md-nav__link">
CHANGELOG
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">目录</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#httprunner-class" class="md-nav__link">
HttpRunner class
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
可用初始化参数
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
可用调用方法
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
可用属性
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
运行测试用例
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
传入测试用例文件路径
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
传入标准的测试用例结构体
</a>
</li>
<li class="md-nav__item">
<a href="#debugtalkpy-env" class="md-nav__link">
加载 debugtalk.py &amp;&amp; .env
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
返回详细测试结果数据
</a>
</li>
<li class="md-nav__item">
<a href="#html" class="md-nav__link">
生成 HTML 测试报告
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="_1">开发扩展<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h1>
<p>HttpRunner 除了作为命令行工具使用外,还可以作为软件包集成到你自己的项目中。</p>
<p>简单来说HttpRunner 提供了运行 YAML/JSON 格式测试用例的能力,并能返回详细的测试结果信息。</p>
<h2 id="httprunner-class">HttpRunner class<a class="headerlink" href="#httprunner-class" title="Permanent link">&para;</a></h2>
<p>HttpRunner 以 <code>class</code> 的形式对外提供调用支持,类名<code>HttpRunner</code>,导入方式如下:</p>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">httprunner.api</span> <span class="kn">import</span> <span class="n">HttpRunner</span>
</pre></div>
<h3 id="_2">可用初始化参数<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<p><code>HttpRunner</code> 内部用于驱动测试执行的是 <code>unittest.TextTestRunner</code>,在初始化 <code>HttpRunner</code> 时可以使用 TextTestRunner 的所有可用参数(详情可阅读<a href="https://docs.python.org/3.6/library/unittest.html#unittest.TextTestRunner">官方文档</a>)。除此之外,<code>HttpRunner</code>还额外支持一个参数,<code>http_client_session</code>,可用于指定不同的客户端类型。</p>
<p>通常情况下,初始化 <code>HttpRunner</code> 时常用的参数有如下几个:</p>
<ul>
<li><code>resultclass</code>: HtmlTestResult/TextTestResult默认值为 HtmlTestResult</li>
<li><code>failfast</code>: 设置为 True 时,测试在首次遇到错误或失败时会停止运行;默认值为 False</li>
<li><code>http_client_session</code>: 传入<code>requests.Session()</code>时进行自动化测试(默认),传入<code>locust.client.Session()</code>时进行性能测试</li>
</ul>
<p>例如,如需初始化 <code>HttpRunner</code> 时设置 <code>failfast</code> 为 False初始化方式如下所示:</p>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">httprunner.api</span> <span class="kn">import</span> <span class="n">HttpRunner</span>
<span class="n">runner</span> <span class="o">=</span> <span class="n">HttpRunner</span><span class="p">(</span><span class="n">failfast</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</pre></div>
<h3 id="_3">可用调用方法<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>
<p><code>HttpRunner</code> 中,对外提供了两个方法:</p>
<ul>
<li><code>run</code>: 运行测试用例</li>
<li><code>gen_html_report</code>: 生成 HTML 测试报告</li>
</ul>
<h3 id="_4">可用属性<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3>
<p><code>HttpRunner</code> 中,对外提供了一个属性:</p>
<ul>
<li><code>summary</code>: 测试执行结果</li>
</ul>
<p>该属性需要在调用 <code>run</code> 方法后获取。</p>
<h2 id="_5">运行测试用例<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h2>
<p><code>HttpRunner</code> 的 run 方法有三个参数:</p>
<ul>
<li><code>path_or_testcases</code>: 指定要运行的测试用例支持传入两类参数YAML/JSON 格式测试用例文件路径,或者标准的测试用例结构体;</li>
<li><code>dot_env_path</code>(可选): 指定加载环境变量文件(.env的路径默认值为当前工作目录PWD中的 <code>.env</code> 文件</li>
<li><code>mapping</code>(可选): 变量映射,可用于对传入测试用例中的变量进行覆盖替换。</li>
</ul>
<h3 id="_6">传入测试用例文件路径<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3>
<p>指定测试用例文件路径支持三种形式:</p>
<ul>
<li>YAML/JSON 文件路径,支持绝对路径和相对路径</li>
<li>包含 YAML/JSON 文件的文件夹,支持绝对路径和相对路径</li>
<li>文件路径和文件夹路径的混合情况list/set</li>
</ul>
<div class="codehilite"><pre><span></span><span class="c1"># 文件路径</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;docs/data/demo-quickstart-2.yml&quot;</span><span class="p">)</span>
<span class="c1"># 文件夹路径</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;docs/data/&quot;</span><span class="p">)</span>
<span class="c1"># 混合情况</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;docs/data/&quot;</span><span class="p">,</span> <span class="s2">&quot;files/demo-quickstart-2.yml&quot;</span><span class="p">])</span>
</pre></div>
<p>如需指定加载环境变量文件(.env的路径或者需要对测试用例中的变量进行覆盖替换则可使用 <code>dot_env_path</code><code>mapping</code> 参数。</p>
<div class="codehilite"><pre><span></span><span class="c1"># dot_env_path</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;docs/data/demo-quickstart-2.yml&quot;</span><span class="p">,</span> <span class="n">dot_env_path</span><span class="o">=</span><span class="s2">&quot;/path/to/.env&quot;</span><span class="p">)</span>
<span class="c1"># mapping</span>
<span class="n">override_mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;device_sn&quot;</span><span class="p">:</span> <span class="s2">&quot;XXX&quot;</span>
<span class="p">}</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;docs/data/demo-quickstart-2.yml&quot;</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="n">override_mapping</span><span class="p">)</span>
</pre></div>
<h3 id="_7">传入标准的测试用例结构体<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3>
<p>除了传入测试用例文件路径,还可以直接传入标准的测试用例结构体。</p>
<p><a href="/data/demo-quickstart-2.yml">demo-quickstart-2.yml</a> 为例,对应的数据结构体如下所示:</p>
<div class="codehilite"><pre><span></span><span class="p">[</span>
<span class="p">{</span>
<span class="nt">&quot;config&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;testcase description&quot;</span><span class="p">,</span>
<span class="nt">&quot;request&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;base_url&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;python-requests/2.18.4&quot;</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;variables&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="nt">&quot;output&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;token&quot;</span><span class="p">],</span>
<span class="nt">&quot;path&quot;</span><span class="p">:</span> <span class="s2">&quot;/abs-path/to/demo-quickstart-2.yml&quot;</span><span class="p">,</span>
<span class="nt">&quot;refs&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;env&quot;</span><span class="p">:</span> <span class="p">{},</span>
<span class="nt">&quot;debugtalk&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;variables&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;SECRET_KEY&quot;</span><span class="p">:</span> <span class="s2">&quot;DebugTalk&quot;</span>
<span class="p">},</span>
<span class="nt">&quot;functions&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;gen_random_string&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">gen_random_string</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596268</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_sign&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_sign</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">1085962</span><span class="err">f</span><span class="mi">0</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_user_id&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_user_id</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596378</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_account&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_account</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596400</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_os_platform&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_os_platform</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596488</span><span class="err">&gt;</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;def-api&quot;</span><span class="p">:</span> <span class="p">{},</span>
<span class="nt">&quot;def-testcase&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;teststeps&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;/api/get-token&quot;</span><span class="p">,</span>
<span class="nt">&quot;request&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://127.0.0.1:5000/api/get-token&quot;</span><span class="p">,</span>
<span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
<span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;app_version&quot;</span><span class="p">:</span> <span class="s2">&quot;2.8.6&quot;</span><span class="p">,</span> <span class="nt">&quot;device_sn&quot;</span><span class="p">:</span> <span class="s2">&quot;FwgRiO7CNA50DSU&quot;</span><span class="p">,</span> <span class="nt">&quot;os_platform&quot;</span><span class="p">:</span> <span class="s2">&quot;ios&quot;</span><span class="p">,</span> <span class="nt">&quot;user_agent&quot;</span><span class="p">:</span> <span class="s2">&quot;iOS/10.3&quot;</span><span class="p">},</span>
<span class="nt">&quot;json&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;sign&quot;</span><span class="p">:</span> <span class="s2">&quot;9c0c7e51c91ae963c833a4ccbab8d683c4a90c98&quot;</span><span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;extract&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;content.token&quot;</span><span class="p">}</span>
<span class="p">],</span>
<span class="nt">&quot;validate&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;status_code&quot;</span><span class="p">,</span> <span class="mi">200</span><span class="p">]},</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;headers.Content-Type&quot;</span><span class="p">,</span> <span class="s2">&quot;application/json&quot;</span><span class="p">]},</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;content.success&quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">]}</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;/api/users/1000&quot;</span><span class="p">,</span>
<span class="nt">&quot;request&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://127.0.0.1:5000/api/users/1000&quot;</span><span class="p">,</span> <span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span> <span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;device_sn&quot;</span><span class="p">:</span> <span class="s2">&quot;FwgRiO7CNA50DSU&quot;</span><span class="p">,</span> <span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;$token&quot;</span><span class="p">},</span>
<span class="nt">&quot;json&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;user1&quot;</span><span class="p">,</span> <span class="nt">&quot;password&quot;</span><span class="p">:</span> <span class="s2">&quot;123456&quot;</span><span class="p">}},</span>
<span class="nt">&quot;validate&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;status_code&quot;</span><span class="p">,</span> <span class="mi">201</span><span class="p">]},</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;headers.Content-Type&quot;</span><span class="p">,</span> <span class="s2">&quot;application/json&quot;</span><span class="p">]},</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;content.success&quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">]},</span>
<span class="p">{</span><span class="nt">&quot;eq&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;content.msg&quot;</span><span class="p">,</span> <span class="s2">&quot;user created successfully.&quot;</span><span class="p">]}</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span><span class="err">...</span><span class="p">}</span> <span class="err">#</span> <span class="err">another</span> <span class="err">testcase</span>
<span class="p">]</span>
</pre></div>
<p>传入测试用例结构体时支持传入单个结构体dict或者多个结构体list of dict</p>
<div class="codehilite"><pre><span></span><span class="c1"># 运行单个结构体</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">testcase</span><span class="p">)</span>
<span class="c1"># 运行多个结构体</span>
<span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">testcase1</span><span class="p">,</span> <span class="n">testcase2</span><span class="p">])</span>
</pre></div>
<h3 id="debugtalkpy-env">加载 <code>debugtalk.py</code> &amp;&amp; <code>.env</code><a class="headerlink" href="#debugtalkpy-env" title="Permanent link">&para;</a></h3>
<p>通过传入测试用例文件路径运行测试用例时,HttpRunner 会自动以指定测试用例文件路径为起点,向上搜索 <code>debugtalk.py</code> 文件,并将 <code>debugtalk.py</code> 文件所在的文件目录作为当前工作目录PWD</p>
<p>同时HttpRunner 会在当前工作目录PWD搜索 <code>.env</code> 文件,以及 <code>api</code><code>testcases</code> 文件夹,并自动进行加载。</p>
<p>最终加载得到的存储结构如下所示:</p>
<div class="codehilite"><pre><span></span><span class="p">{</span>
<span class="nt">&quot;env&quot;</span><span class="p">:</span> <span class="p">{},</span>
<span class="nt">&quot;debugtalk&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;variables&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;SECRET_KEY&quot;</span><span class="p">:</span> <span class="s2">&quot;DebugTalk&quot;</span>
<span class="p">},</span>
<span class="nt">&quot;functions&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;gen_random_string&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">gen_random_string</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596268</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_sign&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_sign</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">1085962</span><span class="err">f</span><span class="mi">0</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_user_id&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_user_id</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596378</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_account&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_account</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596400</span><span class="err">&gt;</span><span class="p">,</span>
<span class="nt">&quot;get_os_platform&quot;</span><span class="p">:</span> <span class="err">&lt;function</span> <span class="err">get_os_platform</span> <span class="err">at</span> <span class="mi">0</span><span class="err">x</span><span class="mi">108596488</span><span class="err">&gt;</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;def-api&quot;</span><span class="p">:</span> <span class="p">{},</span>
<span class="nt">&quot;def-testcase&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
<p>其中,<code>env</code> 对应的是 <code>.env</code> 文件中的环境变量,<code>debugtalk</code> 对应的是 <code>debugtalk.py</code> 文件中定义的变量和函数,<code>def-api</code> 对应的是 <code>api</code> 文件夹下定义的接口描述,<code>def-testcase</code> 对应的是 <code>testcases</code> 文件夹下定义的测试用例。</p>
<p>通过传入标准的测试用例结构体执行测试时,传入的数据应包含所有信息,包括 <code>debugtalk.py</code><code>.env</code>、依赖的 api 和 测试用例等;因此也无需再使用 <code>dot_env_path</code><code>mapping</code> 参数,所有信息都要通过 <code>refs</code> 传入。</p>
<h2 id="_8">返回详细测试结果数据<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h2>
<p>运行完成后,通过 <code>summary</code> 属性可获取详尽的运行结果数据。</p>
<div class="codehilite"><pre><span></span><span class="c1"># get result summary</span>
<span class="n">summary</span> <span class="o">=</span> <span class="n">runner</span><span class="o">.</span><span class="n">summary</span>
</pre></div>
<p>其数据结构为:</p>
<div class="codehilite"><pre><span></span><span class="p">{</span>
<span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="nt">&quot;stat&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;testsRun&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
<span class="nt">&quot;failures&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="nt">&quot;errors&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="nt">&quot;skipped&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="nt">&quot;expectedFailures&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="nt">&quot;unexpectedSuccesses&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="nt">&quot;successes&quot;</span><span class="p">:</span> <span class="mi">2</span>
<span class="p">},</span>
<span class="nt">&quot;time&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;start_at&quot;</span><span class="p">:</span> <span class="mf">1538449655.944404</span><span class="p">,</span>
<span class="nt">&quot;duration&quot;</span><span class="p">:</span> <span class="mf">0.03181314468383789</span>
<span class="p">},</span>
<span class="nt">&quot;platform&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;httprunner_version&quot;</span><span class="p">:</span> <span class="s2">&quot;1.5.14&quot;</span><span class="p">,</span>
<span class="nt">&quot;python_version&quot;</span><span class="p">:</span> <span class="s2">&quot;CPython 3.6.5+&quot;</span><span class="p">,</span>
<span class="nt">&quot;platform&quot;</span><span class="p">:</span> <span class="s2">&quot;Darwin-17.6.0-x86_64-i386-64bit&quot;</span>
<span class="p">},</span>
<span class="nt">&quot;details&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;testcase description&quot;</span><span class="p">,</span>
<span class="nt">&quot;base_url&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="nt">&quot;stat&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;testsRun&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nt">&quot;failures&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&quot;errors&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&quot;skipped&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&quot;expectedFailures&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&quot;unexpectedSuccesses&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&quot;successes&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span>
<span class="nt">&quot;time&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;start_at&quot;</span><span class="p">:</span> <span class="mf">1538449655.944404</span><span class="p">,</span> <span class="nt">&quot;duration&quot;</span><span class="p">:</span> <span class="mf">0.03181314468383789</span><span class="p">},</span>
<span class="nt">&quot;records&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;/api/get-token&quot;</span><span class="p">,</span>
<span class="nt">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;success&quot;</span><span class="p">,</span>
<span class="nt">&quot;attachment&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="nt">&quot;meta_data&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;request&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://127.0.0.1:5000/api/get-token&quot;</span><span class="p">,</span>
<span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
<span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;python-requests/2.18.4&quot;</span><span class="p">,</span> <span class="nt">&quot;Accept-Encoding&quot;</span><span class="p">:</span> <span class="s2">&quot;gzip, deflate&quot;</span><span class="p">,</span> <span class="nt">&quot;Accept&quot;</span><span class="p">:</span> <span class="s2">&quot;*/*&quot;</span><span class="p">,</span> <span class="nt">&quot;Connection&quot;</span><span class="p">:</span> <span class="s2">&quot;keep-alive&quot;</span><span class="p">,</span> <span class="nt">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;app_version&quot;</span><span class="p">:</span> <span class="s2">&quot;2.8.6&quot;</span><span class="p">,</span> <span class="nt">&quot;device_sn&quot;</span><span class="p">:</span> <span class="s2">&quot;FwgRiO7CNA50DSU&quot;</span><span class="p">,</span> <span class="nt">&quot;os_platform&quot;</span><span class="p">:</span> <span class="s2">&quot;ios&quot;</span><span class="p">,</span> <span class="nt">&quot;user_agent&quot;</span><span class="p">:</span> <span class="s2">&quot;iOS/10.3&quot;</span><span class="p">,</span> <span class="nt">&quot;Content-Length&quot;</span><span class="p">:</span> <span class="s2">&quot;52&quot;</span><span class="p">},</span>
<span class="nt">&quot;start_timestamp&quot;</span><span class="p">:</span> <span class="mf">1538449655.944801</span><span class="p">,</span>
<span class="nt">&quot;json&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;sign&quot;</span><span class="p">:</span> <span class="s2">&quot;9c0c7e51c91ae963c833a4ccbab8d683c4a90c98&quot;</span><span class="p">},</span>
<span class="nt">&quot;body&quot;</span><span class="p">:</span> <span class="err">b&#39;</span><span class="p">{</span><span class="nt">&quot;sign&quot;</span><span class="p">:</span> <span class="s2">&quot;9c0c7e51c91ae963c833a4ccbab8d683c4a90c98&quot;</span><span class="p">}</span><span class="err">&#39;</span>
<span class="p">},</span>
<span class="nt">&quot;response&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;status_code&quot;</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
<span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;Content-Length&quot;</span><span class="p">:</span> <span class="s2">&quot;46&quot;</span><span class="p">,</span> <span class="nt">&quot;Server&quot;</span><span class="p">:</span> <span class="s2">&quot;Werkzeug/0.14.1 Python/3.6.5+&quot;</span><span class="p">,</span> <span class="nt">&quot;Date&quot;</span><span class="p">:</span> <span class="s2">&quot;Tue, 02 Oct 2018 03:07:35 GMT&quot;</span><span class="p">},</span>
<span class="nt">&quot;content_size&quot;</span><span class="p">:</span> <span class="mi">46</span><span class="p">,</span>
<span class="nt">&quot;response_time_ms&quot;</span><span class="p">:</span> <span class="mf">12.87</span><span class="p">,</span>
<span class="nt">&quot;elapsed_ms&quot;</span><span class="p">:</span> <span class="mf">6.955</span><span class="p">,</span>
<span class="nt">&quot;encoding&quot;</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
<span class="nt">&quot;content&quot;</span><span class="p">:</span> <span class="err">b&#39;</span><span class="p">{</span><span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;CcQ7dBjZZbjIXRkG&quot;</span><span class="p">}</span><span class="err">&#39;</span><span class="p">,</span>
<span class="nt">&quot;content_type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span>
<span class="nt">&quot;ok&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://127.0.0.1:5000/api/get-token&quot;</span><span class="p">,</span>
<span class="nt">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;OK&quot;</span><span class="p">,</span>
<span class="nt">&quot;cookies&quot;</span><span class="p">:</span> <span class="p">{},</span>
<span class="nt">&quot;text&quot;</span><span class="p">:</span> <span class="err">&#39;</span><span class="p">{</span><span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;CcQ7dBjZZbjIXRkG&quot;</span><span class="p">}</span><span class="err">&#39;</span><span class="p">,</span>
<span class="nt">&quot;json&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;CcQ7dBjZZbjIXRkG&quot;</span><span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;validators&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;status_code&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;headers.Content-Type&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;content.success&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">}</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;/api/users/1000&quot;</span><span class="p">,</span>
<span class="nt">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;success&quot;</span><span class="p">,</span>
<span class="nt">&quot;attachment&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="nt">&quot;meta_data&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;request&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://127.0.0.1:5000/api/users/1000&quot;</span><span class="p">,</span>
<span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
<span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;python-requests/2.18.4&quot;</span><span class="p">,</span> <span class="nt">&quot;Accept-Encoding&quot;</span><span class="p">:</span> <span class="s2">&quot;gzip, deflate&quot;</span><span class="p">,</span> <span class="nt">&quot;Accept&quot;</span><span class="p">:</span> <span class="s2">&quot;*/*&quot;</span><span class="p">,</span> <span class="nt">&quot;Connection&quot;</span><span class="p">:</span> <span class="s2">&quot;keep-alive&quot;</span><span class="p">,</span> <span class="nt">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;device_sn&quot;</span><span class="p">:</span> <span class="s2">&quot;FwgRiO7CNA50DSU&quot;</span><span class="p">,</span> <span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;CcQ7dBjZZbjIXRkG&quot;</span><span class="p">,</span> <span class="nt">&quot;Content-Length&quot;</span><span class="p">:</span> <span class="s2">&quot;39&quot;</span><span class="p">},</span>
<span class="nt">&quot;start_timestamp&quot;</span><span class="p">:</span> <span class="mf">1538449655.958944</span><span class="p">,</span>
<span class="nt">&quot;json&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;user1&quot;</span><span class="p">,</span> <span class="nt">&quot;password&quot;</span><span class="p">:</span> <span class="s2">&quot;123456&quot;</span><span class="p">},</span>
<span class="nt">&quot;body&quot;</span><span class="p">:</span> <span class="err">b&#39;</span><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;user1&quot;</span><span class="p">,</span> <span class="nt">&quot;password&quot;</span><span class="p">:</span> <span class="s2">&quot;123456&quot;</span><span class="p">}</span><span class="err">&#39;</span>
<span class="p">},</span>
<span class="nt">&quot;response&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;status_code&quot;</span><span class="p">:</span> <span class="mi">201</span><span class="p">,</span>
<span class="nt">&quot;headers&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;Content-Length&quot;</span><span class="p">:</span> <span class="s2">&quot;54&quot;</span><span class="p">,</span> <span class="nt">&quot;Server&quot;</span><span class="p">:</span> <span class="s2">&quot;Werkzeug/0.14.1 Python/3.6.5+&quot;</span><span class="p">,</span> <span class="nt">&quot;Date&quot;</span><span class="p">:</span> <span class="s2">&quot;Tue, 02 Oct 2018 03:07:35 GMT&quot;</span><span class="p">},</span>
<span class="nt">&quot;content_size&quot;</span><span class="p">:</span> <span class="mi">54</span><span class="p">,</span>
<span class="nt">&quot;response_time_ms&quot;</span><span class="p">:</span> <span class="mf">3.34</span><span class="p">,</span>
<span class="nt">&quot;elapsed_ms&quot;</span><span class="p">:</span> <span class="mf">2.16</span><span class="p">,</span>
<span class="nt">&quot;encoding&quot;</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
<span class="nt">&quot;content&quot;</span><span class="p">:</span> <span class="err">b&#39;</span><span class="p">{</span><span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;msg&quot;</span><span class="p">:</span> <span class="s2">&quot;user created successfully.&quot;</span><span class="p">}</span><span class="err">&#39;</span><span class="p">,</span>
<span class="nt">&quot;content_type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span>
<span class="nt">&quot;ok&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://127.0.0.1:5000/api/users/1000&quot;</span><span class="p">,</span>
<span class="nt">&quot;reason&quot;</span><span class="p">:</span> <span class="s2">&quot;CREATED&quot;</span><span class="p">,</span>
<span class="nt">&quot;cookies&quot;</span><span class="p">:</span> <span class="p">{},</span>
<span class="nt">&quot;text&quot;</span><span class="p">:</span> <span class="err">&#39;</span><span class="p">{</span><span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;msg&quot;</span><span class="p">:</span> <span class="s2">&quot;user created successfully.&quot;</span><span class="p">}</span><span class="err">&#39;</span><span class="p">,</span>
<span class="nt">&quot;json&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;success&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;msg&quot;</span><span class="p">:</span> <span class="s2">&quot;user created successfully.&quot;</span><span class="p">}</span>
<span class="p">},</span>
<span class="nt">&quot;validators&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;status_code&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="mi">201</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="mi">201</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;headers.Content-Type&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;content.success&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">},</span>
<span class="p">{</span><span class="nt">&quot;check&quot;</span><span class="p">:</span> <span class="s2">&quot;content.msg&quot;</span><span class="p">,</span> <span class="nt">&quot;expect&quot;</span><span class="p">:</span> <span class="s2">&quot;user created successfully.&quot;</span><span class="p">,</span> <span class="nt">&quot;comparator&quot;</span><span class="p">:</span> <span class="s2">&quot;eq&quot;</span><span class="p">,</span> <span class="nt">&quot;check_value&quot;</span><span class="p">:</span> <span class="s2">&quot;user created successfully.&quot;</span><span class="p">,</span> <span class="nt">&quot;check_result&quot;</span><span class="p">:</span> <span class="s2">&quot;pass&quot;</span><span class="p">}</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">],</span>
<span class="nt">&quot;in_out&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">&quot;in&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;SECRET_KEY&quot;</span><span class="p">:</span> <span class="s2">&quot;DebugTalk&quot;</span><span class="p">},</span>
<span class="nt">&quot;out&quot;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&quot;token&quot;</span><span class="p">:</span> <span class="s2">&quot;CcQ7dBjZZbjIXRkG&quot;</span><span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">}</span>
</pre></div>
<h2 id="html">生成 HTML 测试报告<a class="headerlink" href="#html" title="Permanent link">&para;</a></h2>
<p>如需生成 HTML 测试报告,可调用 <code>gen_html_report</code> 方法。</p>
<div class="codehilite"><pre><span></span><span class="c1"># generate html report</span>
<span class="n">runner</span><span class="o">.</span><span class="n">gen_html_report</span><span class="p">(</span>
<span class="n">html_report_name</span><span class="o">=</span><span class="s2">&quot;demo&quot;</span><span class="p">,</span>
<span class="n">html_report_template</span><span class="o">=</span><span class="s2">&quot;/path/to/custom_report_template&quot;</span>
<span class="p">)</span>
<span class="c1"># =&gt; reports/demo/demo-1532078874.html</span>
</pre></div>
<p>关于测试报告的详细内容,请查看<a href="/run-tests/report/">测试报告</a>部分。</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../architecture/" title="Pipline" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
上一页
</span>
Pipline
</span>
</div>
</a>
<a href="../../FAQ/" title="FAQ" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
下一页
</span>
FAQ
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2017 - 2019 debugtalk
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
<div class="md-footer-social">
<link rel="stylesheet" href="../../assets/fonts/font-awesome.css">
<a href="https://debugtalk.com" class="md-footer-social__link fa fa-globe"></a>
<a href="https://github.com/httprunner" class="md-footer-social__link fa fa-github"></a>
</div>
</div>
</div>
</footer>
</div>
<script src="../../assets/javascripts/application.ac79c3b0.js"></script>
<script src="../../assets/javascripts/lunr/lunr.stemmer.support.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:"../.."}})</script>
<script src="../../js/slardar.js"></script>
</body>
</html>