hexo-blog-deploy/2021/10/10/BDD-python+behave自动化测试搭建/index.html

16 lines
36 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-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><meta name="theme-color" content="#222"><meta name="generator" content="Hexo 5.4.2"><link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png"><link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png"><link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png"><link rel="mask-icon" href="/images/logo.svg" color="#222"><link rel="stylesheet" href="/css/main.css"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha256-HtsXJanqjKTc8vVQjO4YMhiqFoXkfBsjBWcX91T1jr8=" crossorigin="anonymous"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css" integrity="sha256-Vzbj7sDDS/woiFS3uNKo8eIuni59rjyNGtXfstRzStA=" crossorigin="anonymous"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/themes/blue/pace-theme-minimal.css"><script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/pace.min.js" integrity="sha256-gqd7YTjg/BtfqWSwsJOvndl0Bxc8gFImLEkXQT8+qj0=" crossorigin="anonymous"></script><script class="next-config" data-name="main" type="application/json">{"hostname":"kiki.kim","root":"/","images":"/images","scheme":"Gemini","darkmode":false,"version":"8.15.1","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":true,"style":"flat"},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":false,"async":false,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果:${query}","hits_time":"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)","hits":"找到 ${hits} 个搜索结果"},"path":"/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script><script src="/js/config.js"></script><meta name="description" content="Behave 是一种基于行为驱动开发Behavior-Driven Development, BDD的 Python 测试框架。"><meta property="og:type" content="article"><meta property="og:title" content="BDD-python+behave自动化测试搭建"><meta property="og:url" content="http://kiki.kim/2021/10/10/BDD-python+behave%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%90%AD%E5%BB%BA/index.html"><meta property="og:site_name" content="随言碎语"><meta property="og:description" content="Behave 是一种基于行为驱动开发Behavior-Driven Development, BDD的 Python 测试框架。"><meta property="og:locale" content="zh_CN"><meta property="og:image" content="https://halliday.oss-cn-nanjing.aliyuncs.com/image-20230427171609391.png"><meta property="article:published_time" content="2021-10-10T11:56:34.000Z"><meta property="article:modified_time" content="2024-12-29T05:10:11.020Z"><meta property="article:author" content="小梦同学"><meta property="article:tag" content="BDD"><meta property="article:tag" content="python"><meta property="article:tag" content="behave"><meta property="article:tag" content="自动化测试"><meta name="twitter:card" content="summary"><meta name="twitter:image" content="https://halliday.oss-cn-nanjing.aliyuncs.com/image-20230427171609391.png"><link rel="canonical" href="http://kiki.kim/2021/10/10/BDD-python+behave%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%90%AD%E5%BB%BA/"><script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"http://kiki.kim/2021/10/10/BDD-python+behave%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%90%AD%E5%BB%BA/","path":"2021/10/10/BDD-python+behave自动化测试搭建/","title":"BDD-python+behave自动化测试搭建"}</script><script class="next-config" data-name="calendar" type="application/json">""</script><title>BDD-python+behave自动化测试搭建 | 随言碎语</title><noscript><link rel="stylesheet" href="/css/noscript.css"></noscript><link rel="alternate" href="/atom.xml" title="随言碎语" type="application/atom+xml"><style>.darkmode--activated{--body-bg-color:#282828;--content-bg-color:#333;--card-bg-color:#555;--text-color:#ccc;--blockquote-color:#bbb;--link-color:#ccc;--link-hover-color:#eee;--brand-color:#ddd;--brand-hover-color:#ddd;--table-row-odd-bg-color:#282828;--table-row-hover-bg-color:#363636;--menu-item-bg-color:#555;--btn-default-bg:#222;--btn-default-color:#ccc;--btn-default-border-color:#555;--btn-default-hover-bg:#666;--btn-default-hover-color:#ccc;--btn-default-hover-border-color:#666;--highlight-background:#282b2e;--highlight-foreground:#a9b7c6;--highlight-gutter-background:#34393d;--highlight-gutter-foreground:#9ca9b6}.darkmode--activated img{opacity:.75}.darkmode--activated img:hover{opacity:.9}.darkmode--activated code{color:#69dbdc;background:0 0}button.darkmode-toggle{z-index:9999}.darkmode-ignore,img{display:flex!important}.beian img{display:inline-block!important}</style></head><body itemscope itemtype="http://schema.org/WebPage"><div class="headband"></div><main class="main"><div class="column"><header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container"><div class="site-nav-toggle"><div class="toggle" aria-label="切换导航栏" role="button"><span class="toggle-line"></span> <span class="toggle-line"></span> <span class="toggle-line"></span></div></div><div class="site-meta"><a href="/" class="brand" rel="start"><i class="logo-line"></i><p class="site-title">随言碎语</p><i class="logo-line"></i></a><p class="site-subtitle" itemprop="description">咕叽咕叽</p></div><div class="site-nav-right"><div class="toggle popup-trigger" aria-label="搜索" role="button"><i class="fa fa-search fa-fw fa-lg"></i></div></div></div><nav class="site-nav"><ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">64</span></a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">57</span></a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于</a></li><li class="menu-item menu-item-search"><a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索</a></li></ul></nav><div class="search-pop-overlay"><div class="popup search-popup"><div class="search-header"><span class="search-icon"><i class="fa fa-search"></i></span><div class="search-input-container"><input autocomplete="off" autocapitalize="off" maxlength="80" placeholder="搜索..." spellcheck="false" type="search" class="search-input"></div><span class="popup-btn-close" role="button"><i class="fa fa-times-circle"></i></span></div><div class="search-result-container no-result"><div class="search-result-icon"><i class="fa fa-spinner fa-pulse fa-5x"></i></div></div></div></div><script type="text/javascript" src="/js/cursor/zjAdd.js"></script><div class="musicwyy2" style="top:200px;position:fixed;left:0;bottom:0;z-index:105;opacity:1;width:45px;height:45px;font-size:45px;font-family:'Long Cang'"><button type="button" style="top:200px;width:45px;height:45px;margin-top:10px;margin-bottom:10px;border-width:0;z-index:200;background:0 0;border-width:0;outline:0" onclick="musicChange()"><img src="/images/wy.svg"></button></div><div class="musicwyy1" style="position:fixed;top:200px;left:0;bottom:0;z-index:100;opacity:1;width:45px;height:45px;font-size:0"><div class="aplayer-miniswitcher" style="top:200px;height:110px;width:20px;display:inline-block;overflow:hidden"></div><div style="width:calc(100% - 30px);top:200px;height:110px;display:none" id="musicZJ"><div class="musicwyy1" style="position:fixed;top:200px;left:15px;bottom:0;z-index:100;opacity:1;width:300px;height:110px;font-size:0"><div class="aplayer-miniswitcher" style="top:200px;height:110px;width:20px;display:inline-block;overflow:hidden"></div><div style="width:calc(100% - 30px);top:200px;height:110px;display:inline-block" id="musicZJ"><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="450" src="//music.163.com/outchain/player?type=0&id=8009036598&auto=0&height=430"></iframe></div></div></div></div></header><aside class="sidebar"><div class="sidebar-inner sidebar-nav-active sidebar-toc-active"><ul class="sidebar-nav"><li class="sidebar-nav-toc">文章目录</li><li class="sidebar-nav-overview">站点概览</li></ul><div class="sidebar-panel-container"><div class="post-toc-wrap sidebar-panel"><div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-BDD%E7%AE%80%E4%BB%8B"><span class="nav-number">1.</span> <span class="nav-text">1. BDD简介</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-behave%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8"><span class="nav-number">2.</span> <span class="nav-text">2.behave基本使用</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E6%89%A9%E5%B1%95"><span class="nav-number">3.</span> <span class="nav-text">3.扩展</span></a></li></ol></div></div><div class="site-overview-wrap sidebar-panel"><div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person"><img class="site-author-image" itemprop="image" alt="小梦同学" src="https://halliday.oss-cn-nanjing.aliyuncs.com/imagesbjx.png"><p class="site-author-name" itemprop="name">小梦同学</p><div class="site-description" itemprop="description">欲买桂花同载酒,终不似,少年游。</div></div><div class="site-state-wrap animated"><nav class="site-state"><div class="site-state-item site-state-posts"><a href="/archives/"><span class="site-state-item-count">57</span> <span class="site-state-item-name">日志</span></a></div><div class="site-state-item site-state-tags"><a href="/tags/"><span class="site-state-item-count">64</span> <span class="site-state-item-name">标签</span></a></div></nav></div><div class="links-of-author animated"><span class="links-of-author-item"><a href="https://github.com/M-HALLIDAY" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;M-HALLIDAY" rel="noopener me" target="_blank"><i class="fab fa-github fa-fw"></i></a> </span><span class="links-of-author-item"><a href="mailto:halliday2023@163.com" title="E-Mail → mailto:halliday2023@163.com" rel="noopener me" target="_blank"><i class="fa fa-envelope fa-fw"></i></a> </span><span class="links-of-author-item"><a href="/atom.xml" title="RSS → &#x2F;atom.xml" rel="noopener me"><i class="fa fa-rss-square fa-fw"></i></a></span></div><div class="cc-license animated" itemprop="license"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/zh-CN" class="cc-opacity" rel="noopener" target="_blank"><img src="https://cdnjs.cloudflare.com/ajax/libs/creativecommons-vocabulary/2020.11.3/assets/license_badges/small/by_nc_sa.svg" alt="Creative Commons"></a></div></div></div></div></aside></div><div class="main-inner post posts-expand"><div class="post-block"><article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN"><link itemprop="mainEntityOfPage" href="http://kiki.kim/2021/10/10/BDD-python+behave%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%90%AD%E5%BB%BA/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="image" content="https://halliday.oss-cn-nanjing.aliyuncs.com/imagesbjx.png"><meta itemprop="name" content="小梦同学"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="随言碎语"><meta itemprop="description" content="欲买桂花同载酒,终不似,少年游。"></span><span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork"><meta itemprop="name" content="BDD-python+behave自动化测试搭建 | 随言碎语"><meta itemprop="description" content=""></span><header class="post-header"><h1 class="post-title" itemprop="name headline">BDD-python+behave自动化测试搭建</h1><div class="post-meta-container"><div class="post-meta"><span class="post-meta-item"><span class="post-meta-item-icon"><i class="far fa-calendar"></i> </span><span class="post-meta-item-text">发表于</span> <time title="创建时间2021-10-10 19:56:34" itemprop="dateCreated datePublished" datetime="2021-10-10T19:56:34+08:00">2021-10-10</time> </span><span class="post-meta-item"><span class="post-meta-item-icon"><i class="far fa-calendar-check"></i> </span><span class="post-meta-item-text">更新于</span> <time title="修改时间2024-12-29 13:10:11" itemprop="dateModified" datetime="2024-12-29T13:10:11+08:00">2024-12-29</time> </span><span class="post-meta-item" title="阅读次数" id="busuanzi_container_page_pv"><span class="post-meta-item-icon"><i class="far fa-eye"></i> </span><span class="post-meta-item-text">阅读次数:</span> <span id="busuanzi_value_page_pv"></span> </span><span class="post-meta-break"></span> <span class="post-meta-item" title="本文字数"><span class="post-meta-item-icon"><i class="far fa-file-word"></i> </span><span class="post-meta-item-text">本文字数:</span> <span>2.6k</span> </span><span class="post-meta-item" title="阅读时长"><span class="post-meta-item-icon"><i class="far fa-clock"></i> </span><span class="post-meta-item-text">阅读时长 &asymp;</span> <span>5 分钟</span></span></div></div></header><div class="post-body" itemprop="articleBody"><p>Behave 是一种基于行为驱动开发Behavior-Driven Development, BDD的 Python 测试框架。</p><span id="more"></span><h2 id="1-BDD简介">1. BDD简介</h2><p>BDDBehavior Driven Development即行为驱动开发。BDD是ATDD验收测试驱动开发的一种升级版根据明确的预期行为一组场景来进行开发和测试。</p><p>BDD使用<code>Gherkin</code>的自然语言风格来编写测试用例,文件格式为<code>*.feature</code>,如一个后台登录功能,可以描述如下:</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Feature</span>: 登录功能</span><br><span class="line"> <span class="keyword">Scenario</span>: 正常登录</span><br><span class="line"> <span class="keyword">Given</span> 用户名 admin 密码 123456</span><br><span class="line"> <span class="keyword">When</span> 打开后台页面</span><br><span class="line"> <span class="keyword">And</span> 输入用户名</span><br><span class="line"> <span class="keyword">And</span> 输入密码</span><br><span class="line"> <span class="keyword">And</span> 点击登录按钮</span><br><span class="line"> <span class="keyword">Then</span> 页面中应不包含 您输入的帐号信息不正确</span><br><span class="line"></span><br><span class="line"><span class="keyword">Scenario</span>: 账号为空登录</span><br><span class="line"> <span class="keyword">Given</span> 用户名为空 密码 123456</span><br><span class="line"> <span class="keyword">When</span> 打开后台页面</span><br><span class="line"> <span class="keyword">And</span> 输入用户名</span><br><span class="line"> <span class="keyword">And</span> 输入密码</span><br><span class="line"> <span class="keyword">And</span> 点击登录按钮</span><br><span class="line"> <span class="keyword">Then</span> 页面中应包含 您输入的帐号信息不正确</span><br><span class="line"></span><br><span class="line"><span class="keyword">Scenario</span>: 密码为空登录</span><br><span class="line"> <span class="keyword">Given</span> 用户名 admin 密码为空</span><br><span class="line"> <span class="keyword">When</span> 打开后台页面</span><br><span class="line"> <span class="keyword">And</span> 输入用户名</span><br><span class="line"> <span class="keyword">And</span> 输入密码</span><br><span class="line"> <span class="keyword">And</span> 点击登录按钮</span><br><span class="line"> <span class="keyword">Then</span> 页面中应包含 您输入的帐号信息不正确</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>以上就表示了一个完整的的测试,由于使用的是自然语言,因此这种自动化测试用例无论是从书写上,还是阅读上都是很容易的,完全可以交付给非技术类型的人去编写。</p><p><code>Gherkin</code>语法中的关键词:</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Feature</span>: 特性,一般指一个功能点,如登录,添加商品,查询商品等,在测试中对应一个测试套件</span><br><span class="line"><span class="keyword">Scenario</span>场景即Story一个明确的场景对应一个测试用例</span><br><span class="line">Step: 步骤,测试步骤有<span class="keyword">Given</span>/<span class="keyword">When</span>/<span class="keyword">Then</span>三种</span><br><span class="line"><span class="keyword">Given</span>: 假设给定数据或前置条件对应测试中的setup</span><br><span class="line"><span class="keyword">When</span>: 当...时,对应一个测试步骤</span><br><span class="line"><span class="keyword">Then</span>: 然后,即期望结果,对应一个测试断言</span><br><span class="line"><span class="keyword">And</span>: 同上,可以用于<span class="keyword">Given</span>/<span class="keyword">When</span>/<span class="keyword">Then</span></span><br><span class="line"></span><br><span class="line">甚至可以将关键词改为中文的描述,例如:</span><br><span class="line"></span><br><span class="line"><span class="comment"># language: zh-CN</span></span><br><span class="line">功能: 测试数字加法计算结果正确</span><br><span class="line"></span><br><span class="line"> 场景: 验证计算结果</span><br><span class="line"> 假如 输入50 输入50</span><br><span class="line"> 那么 结果是 100</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>行为驱动多用于UI层的测试。因此BDD框架的自动化一般结合Selenium使用。</p><h2 id="2-behave基本使用">2.behave基本使用</h2><ol><li><p>常用的BDD框架</p><p>最出名的BDD框架应该是Cucumber使用Ruby语言Python中常用的有behave、pytest-bdd和lettuce其中lettuce不支持Python3。</p><p>behave是比较易用的一款BDD测试框架github地址为<a target="_blank" rel="noopener" href="https://github.com/behave/behave">https://github.com/behave/behave</a></p></li><li><p>安装behave和selenium</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install behave</span><br><span class="line">pip install selenium</span><br></pre></td></tr></table></figure><p>演示项目仓库:<a target="_blank" rel="noopener" href="https://gitea.kiki.kim/ha/behave-web-demo.git">https://gitea.kiki.kim/ha/behave-web-demo.git</a></p></li><li><p>项目所需的最小目录结构</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">+--features/</span><br><span class="line">| +--steps/ # -- 存放测试步骤的目录</span><br><span class="line">| | +-- *.py # -- 测试步骤的具体实现</span><br><span class="line">| +-- *.feature # -- 测试用例 </span><br><span class="line">| +-- environment.py # 可选用于自定义behave的环境变量例如可以定义每个Scenario结束后做XXX事。</span><br></pre></td></tr></table></figure></li><li><p>编写场景文件</p><p>在features中新建一个<code>baidu.feature</code>的文件,内容如下:</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Feature</span>: 百度搜索</span><br><span class="line"> <span class="keyword">Scenario</span>: 搜索关键词</span><br><span class="line"> <span class="keyword">Given</span> 关键词 behave</span><br><span class="line"> <span class="keyword">When</span> 打开百度页面</span><br><span class="line"> <span class="keyword">And</span> 输入关键词</span><br><span class="line"> <span class="keyword">And</span> 点击百度一下按钮</span><br><span class="line"> <span class="keyword">Then</span> 页面标题中应包含关键词</span><br></pre></td></tr></table></figure></li><li><p>实现场景步骤</p><p>在features中新建steps目录在steps目录中新建<code>baidu_steps.py</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> behave <span class="keyword">import</span> given, when, then</span><br><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> sleep</span><br><span class="line"></span><br><span class="line"><span class="meta">@given(<span class="params"><span class="string">&#x27;关键词 &#123;keyword&#125;&#x27;</span></span>) </span><span class="comment"># 对应步骤 Given 关键词 behave 参数放在&#123;&#125;</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">step_impl</span>(<span class="params">context, keyword</span>): <span class="comment"># context是上下文对象有参数的话加上对应参数</span></span><br><span class="line"> context.keyword = keyword <span class="comment"># 将参数绑定上下文对象,以便其他步骤使用</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@when(<span class="params"><span class="string">&#x27;打开百度页面&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">step_impl</span>(<span class="params">context</span>):</span><br><span class="line"> context.driver = driver = webdriver.Chrome() <span class="comment"># 同样绑定上下文对象</span></span><br><span class="line"> driver.implicitly_wait(<span class="number">10</span>)</span><br><span class="line"> driver.get(<span class="string">&#x27;https://www.baidu.com&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@when(<span class="params"><span class="string">&#x27;输入关键词&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">step_impl</span>(<span class="params">context</span>):</span><br><span class="line"> context.driver.find_element(<span class="string">&#x27;id&#x27;</span>, <span class="string">&#x27;kw&#x27;</span>).send_keys(context.keyword)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@when(<span class="params"><span class="string">&#x27;点击百度一下按钮&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">step_impl</span>(<span class="params">context</span>):</span><br><span class="line"> context.driver.find_element(<span class="string">&#x27;id&#x27;</span>, <span class="string">&#x27;su&#x27;</span>).click()</span><br><span class="line"> sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@then(<span class="params"><span class="string">&#x27;页面标题中应包含关键词&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">step_impl</span>(<span class="params">context</span>):</span><br><span class="line"> <span class="keyword">assert</span> context.keyword <span class="keyword">in</span> context.driver.title</span><br></pre></td></tr></table></figure></li><li><p>运行</p><p>直接在<code>features</code>同级目录执行<code>behave</code>即可</p><p><img src="https://halliday.oss-cn-nanjing.aliyuncs.com/image-20230427171609391.png" alt="image-20230427171609391"></p></li></ol><h2 id="3-扩展">3.扩展</h2><p>基于behave框架GitHub上有很多好用的第三方插件可以使用</p><ul><li><a target="_blank" rel="noopener" href="https://github.com/ggozad/behaving">behaving</a> —基于behave的web自动化测试</li><li><a target="_blank" rel="noopener" href="https://github.com/mikek/behave-http">behave-http</a> —基于behave的接口自动化测试</li><li><a target="_blank" rel="noopener" href="https://github.com/M-HALLIDAY/behave-db">behave-db</a> —基于behave的数据库自动化测试</li></ul></div><footer class="post-footer"><div><div style="text-align:center;color:#ccc;font-size:24px;padding-top:10px">----- The End -----</div><div><center><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/social-share.js/1.0.16/css/share.min.css"><div class="social-share" data-sites="weibo, qq, qzone,wechat"></div><script src="http://apps.bdimg.com/libs/jquery/1.8.2/jquery.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/social-share.js/1.0.16/js/social-share.min.js"></script></center></div></div><div class="post-copyright"><ul><li class="post-copyright-author"><strong>本文作者: </strong>小梦同学</li><li class="post-copyright-link"><strong>本文链接:</strong> <a href="http://kiki.kim/2021/10/10/BDD-python+behave%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%90%AD%E5%BB%BA/" title="BDD-python+behave自动化测试搭建">http://kiki.kim/2021/10/10/BDD-python+behave自动化测试搭建/</a></li><li class="post-copyright-license"><strong>版权声明: </strong>本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/zh-CN" rel="noopener" target="_blank"><i class="fab fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处!</li></ul></div><div class="post-tags"><a href="/tags/BDD/" rel="tag"><i class="fa fa-tag"></i> BDD</a> <a href="/tags/python/" rel="tag"><i class="fa fa-tag"></i> python</a> <a href="/tags/behave/" rel="tag"><i class="fa fa-tag"></i> behave</a> <a href="/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/" rel="tag"><i class="fa fa-tag"></i> 自动化测试</a></div><script type="text/javascript">for(var tagsall=document.getElementsByClassName("post-tags"),i=tagsall.length-1;0<=i;i--)for(var tags=tagsall[i].getElementsByTagName("a"),j=tags.length-1;0<=j;j--){var r,g,b,golden_ratio=.618033988749895,s=.5,v=.999,h=golden_ratio+.8*Math.random()-.5,h_i=parseInt(6*h),f=6*h-h_i,p=v*(1-s),q=v*(1-f*s),t=v*(1-(1-f)*s);switch(h_i){case 0:r=v,g=t,b=p;break;case 1:r=q,g=v,b=p;break;case 2:r=p,g=v,b=t;break;case 3:r=p,g=q,b=v;break;case 4:r=t,g=p,b=v;break;case 5:r=v,g=p,b=q;break;default:b=g=r=1}tags[j].style.background="rgba("+parseInt(255*r)+","+parseInt(255*g)+","+parseInt(255*b)+",0.5)"}</script><div class="post-nav"><div class="post-nav-item"><a href="/2021/09/09/python+patool%E5%A4%84%E7%90%86%E4%B8%8D%E5%90%8C%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%8E%8B%E7%BC%A9%E5%8C%85/" rel="prev" title="python+patool处理不同类型的压缩包"><i class="fa fa-chevron-left"></i> python+patool处理不同类型的压缩包</a></div><div class="post-nav-item"><a href="/2021/11/23/linux%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88%E5%92%8C%E9%97%AE%E9%A2%98%E5%A4%84%E7%90%86/" rel="next" title="linux工具集合和问题处理">linux工具集合和问题处理 <i class="fa fa-chevron-right"></i></a></div></div></footer></article></div></div></main><footer class="footer"><div class="footer-inner"><div class="copyright">&copy; <span itemprop="copyrightYear">2024</span> <span class="with-love"><i class="fa fa-heart"></i> </span><span class="author" itemprop="copyrightHolder">小梦同学</span></div><div class="beian"><img src="/images/beian.png" alt=""><a href="https://www.beian.gov.cn/portal/registerSystemInfo?recordcode=32132302010292" rel="noopener" target="_blank">苏公网安备 32132302010292号 </a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://beian.miit.gov.cn/" rel="noopener" target="_blank">苏ICP备2021047152号-1</a></div><div class="busuanzi-count"><span class="post-meta-item" id="busuanzi_container_site_uv"><span class="post-meta-item-icon"><i class="fa fa-user"></i> </span><span class="site-uv" title="总访客量"><span id="busuanzi_value_site_uv"></span> </span></span><span class="post-meta-item" id="busuanzi_container_site_pv"><span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="site-pv" title="总访问量"><span id="busuanzi_value_site_pv"></span></span></span></div><div class="powered-by"><a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/" rel="noopener" target="_blank">NexT.Gemini</a> 强力驱动</div><span id="timeDate">载入天数...</span> <span id="times">载入时分秒...</span><script>var now=new Date;function createtime(){var n=new Date("03/01/2023 10:00:00");now.setTime(now.getTime()+250),days=(now-n)/1e3/60/60/24,dnum=Math.floor(days),hours=(now-n)/1e3/60/60-24*dnum,hnum=Math.floor(hours),1==String(hnum).length&&(hnum="0"+hnum),minutes=(now-n)/1e3/60-1440*dnum-60*hnum,mnum=Math.floor(minutes),1==String(mnum).length&&(mnum="0"+mnum),seconds=(now-n)/1e3-86400*dnum-3600*hnum-60*mnum,snum=Math.round(seconds),1==String(snum).length&&(snum="0"+snum),document.getElementById("timeDate").innerHTML="本站已安全运行 "+dnum+" 天 ",document.getElementById("times").innerHTML=hnum+" 小时 "+mnum+" 分 "+snum+" 秒."}setInterval("createtime()",250)</script></div></footer><div class="back-to-top" role="button" aria-label="返回顶部"><i class="fa fa-arrow-up fa-lg"></i> <span>0%</span></div><div class="reading-progress-bar"></div><a href="https://github.com/M-HALLIDAY" class="github-corner" title="在 GitHub 上关注我" aria-label="在 GitHub 上关注我" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin:130px 106px" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><noscript><div class="noscript-warning">Theme NexT works best with JavaScript enabled</div></noscript><script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js" integrity="sha256-oP6HI9z1XaZNBrJURtCoUT5SUnxFr8s3BzRl+cbzUq8=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js" integrity="sha256-yt2kYMy0w8AbtF89WXb2P1rfjcP/HTHLT7097U8Y5b8=" crossorigin="anonymous"></script><script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/next-boot.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/hexo-generator-searchdb/1.4.1/search.js" integrity="sha256-1kfA5uHPf65M5cphT2dvymhkuyHPQp5A53EGZOnOLmc=" crossorigin="anonymous"></script><script src="/js/third-party/search/local-search.js"></script><script src="/js/third-party/fancybox.js"></script><script src="/js/third-party/pace.js"></script><script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><script src="https://unpkg.com/darkmode-js@1.5.7/lib/darkmode-js.min.js"></script><script>var options = {
bottom: '64px',
right: 'unset',
left: '32px',
time: '0.5s',
mixColor: 'transparent',
backgroundColor: 'transparent',
buttonColorDark: '#100f2c',
buttonColorLight: '#fff',
saveInCookies: true,
label: '🌓',
autoMatchOsTheme: true
}
const darkmode = new Darkmode(options);
window.darkmode = darkmode;
darkmode.showWidget();</script><script async src="/js/cursor/love.min.js"></script><script type="text/javascript" src="//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js"></script></body></html>