Files
httprunner/development/dev-api/index.html
T

1280 lines
68 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
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="#tldr" class="md-nav__link">
TL;DR
</a>
</li>
<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>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
传入测试用例文件路径
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
传入标准的测试用例结构体
</a>
</li>
</ul>
</nav>
</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="#_6" 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>
<li class="md-nav__item">
<a href="../../examples/demo-klook/" title="klook" class="md-nav__link">
klook
</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="#tldr" class="md-nav__link">
TL;DR
</a>
</li>
<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>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
传入测试用例文件路径
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
传入标准的测试用例结构体
</a>
</li>
</ul>
</nav>
</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="#_6" 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>
<h3 id="tldr">TL;DR<a class="headerlink" href="#tldr" title="Permanent link">&para;</a></h3>
<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>
<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">True</span><span class="p">,</span>
<span class="n">save_tests</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">log_level</span><span class="o">=</span><span class="s2">&quot;INFO&quot;</span><span class="p">,</span>
<span class="n">log_file</span><span class="o">=</span><span class="s2">&quot;test.log&quot;</span>
<span class="p">)</span>
<span class="n">summary</span> <span class="o">=</span> <span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">path_or_tests</span><span class="p">)</span>
</pre></div>
<h3 id="_2">初始化参数说明<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<p>通常情况下,初始化 <code>HttpRunner</code> 时的参数有如下几个:</p>
<ul>
<li><code>failfast</code>(可选): 设置为 True 时,测试在首次遇到错误或失败时会停止运行;默认值为 False</li>
<li><code>save_tests</code>(可选): 设置为 True 时,会将运行过程中的状态(loaded/parsed/summary)保存为 JSON 文件,存储于 logs 目录下;默认为 False</li>
<li><code>log_level</code>(可选): 设置日志级别,默认为 "INFO"</li>
<li><code>log_file</code>(可选): 设置日志文件路径,指定后将同时输出日志文件;默认不输出日志文件</li>
</ul>
<h3 id="_3">调用方法说明<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>
<p><code>HttpRunner</code> 中,对外提供了一个 <code>run</code> 方法,用于运行测试用例。</p>
<p>run 方法有三个参数:</p>
<ul>
<li><code>path_or_tests</code>(必传): 指定要运行的测试用例;支持传入两类参数<ul>
<li>str: YAML/JSON 格式测试用例文件路径</li>
<li>dict: 标准的测试用例结构体</li>
</ul>
</li>
<li><code>dot_env_path</code>(可选): 指定加载环境变量文件(.env)的路径,默认值为当前工作目录(PWD)中的 <code>.env</code> 文件</li>
<li><code>mapping</code>(可选): 变量映射,可用于对传入测试用例中的变量进行覆盖替换。</li>
</ul>
<h4 id="_4">传入测试用例文件路径<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4>
<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>
<h4 id="_5">传入标准的测试用例结构体<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4>
<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="_6">返回详细测试结果数据<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h2>
<p>运行完成后,通过 <code>run()</code> 方法的返回结果可获取详尽的运行结果数据。</p>
<div class="codehilite"><pre><span></span><span class="n">summary</span> <span class="o">=</span> <span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">path_or_tests</span><span class="p">)</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>report.gen_html_report</code> 方法。</p>
<div class="codehilite"><pre><span></span><span class="kn">from</span> <span class="nn">httprunner</span> <span class="kn">import</span> <span class="n">report</span>
<span class="n">report_path</span> <span class="o">=</span> <span class="n">report</span><span class="o">.</span><span class="n">gen_html_report</span><span class="p">(</span>
<span class="n">summary</span><span class="p">,</span>
<span class="n">report_template</span><span class="o">=</span><span class="s2">&quot;/path/to/custom_report_template&quot;</span><span class="p">,</span>
<span class="n">report_dir</span><span class="o">=</span><span class="s2">&quot;/path/to/reports_dir&quot;</span><span class="p">,</span>
<span class="n">report_file</span><span class="o">=</span><span class="s2">&quot;/path/to/report_file_path&quot;</span>
<span class="p">)</span>
</pre></div>
<p><code>gen_html_report()</code> 的参数有四个:</p>
<ul>
<li>summary(必传): 测试运行结果汇总数据 </li>
<li>report_template(可选): 指定自定义的 HTML 报告模板,模板必须采用 Jinja2 的格式</li>
<li>report_dir(可选): 指定生成报告的文件夹路径</li>
<li>report_file(可选): 指定生成报告的文件路径,该参数的优先级高于 report_dir</li>
</ul>
<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>