<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>测试 on Yuanjie-跑步爱好者，IT从业者。</title><link>https://shiyuanjie.cn/categories/%E6%B5%8B%E8%AF%95/</link><description>Recent content in 测试 on Yuanjie-跑步爱好者，IT从业者。</description><image><title>Yuanjie-跑步爱好者，IT从业者。</title><url>https://shiyuanjie.cn/og-default.png</url><link>https://shiyuanjie.cn/og-default.png</link></image><generator>Hugo -- 0.151.0</generator><language>zh-CN</language><lastBuildDate>Wed, 27 May 2020 12:25:12 +0800</lastBuildDate><atom:link href="https://shiyuanjie.cn/categories/%E6%B5%8B%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>Bug Review</title><link>https://shiyuanjie.cn/posts/QA/BugReview/</link><pubDate>Wed, 27 May 2020 12:25:12 +0800</pubDate><guid>https://shiyuanjie.cn/posts/QA/BugReview/</guid><description>&lt;blockquote&gt;
&lt;p&gt;今天有个朋友问到，BUG Review有什么注意事情和流程方法没？简单整理了下，便于后续回顾。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;源地址：&lt;a href="https://mubu.com/doc/amsCZEE1YV"&gt;https://mubu.com/doc/amsCZEE1YV&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;流程
&lt;ul&gt;
&lt;li&gt;host
&lt;ul&gt;
&lt;li&gt;QA&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;流程
&lt;ul&gt;
&lt;li&gt;QA搜集各位输入信息，并整理数据分布&lt;/li&gt;
&lt;li&gt;所有参与人员一起讨论，并制定后续改进&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;时机
&lt;ul&gt;
&lt;li&gt;不确定，建议：团队质量较差或者定期做&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;参与人
&lt;ul&gt;
&lt;li&gt;全团队成员&lt;/li&gt;
&lt;li&gt;必要可以拉上客户&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;输入
&lt;ul&gt;
&lt;li&gt;所有的BUG单&lt;/li&gt;
&lt;li&gt;反馈信息(客户/用户/其它渠道)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;输出
&lt;ul&gt;
&lt;li&gt;各种分布
&lt;ul&gt;
&lt;li&gt;新增/修复/关闭时间&lt;/li&gt;
&lt;li&gt;BUG的模块分类，如：登录模块/订单模块 等&lt;/li&gt;
&lt;li&gt;BUG的原因分类，如：需要描述不清晰/程序代码问题/再次出现 等&lt;/li&gt;
&lt;li&gt;优先级划分&lt;/li&gt;
&lt;li&gt;责任人&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;后续改进
&lt;ul&gt;
&lt;li&gt;改进策略&lt;/li&gt;
&lt;li&gt;下一次Review的时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;注意
&lt;ul&gt;
&lt;li&gt;责任人
&lt;ul&gt;
&lt;li&gt;看情况是否需要拉出来讨论&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;改进策略
&lt;ul&gt;
&lt;li&gt;这部分才是Review的目的&lt;/li&gt;
&lt;li&gt;分布的情况，打开讨论，并制定Action。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Review的结论
&lt;ul&gt;
&lt;li&gt;如果是给客户的，要酌情做一些内容的调整&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JMeter5.2.1更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter5.2.1/</link><pubDate>Sat, 11 Jan 2020 18:00:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter5.2.1/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;版本发布时间于20191113，本次版本主要是BugFix。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="主要内容"&gt;主要内容&lt;/h2&gt;
&lt;p&gt;本次更新主要为BugFix，更新内容参考5.2。&lt;/p&gt;
&lt;h2 id="版本下载"&gt;版本下载&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/apache/jmeter/archive/v5.2.1-rc1.zip"&gt;JMeter5.2.1&lt;/a&gt;&lt;/p&gt;</description></item><item><title>JMeter5.2更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Wed, 08 Jan 2020 15:30:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;版本发布时间于20191008，本次版本基本没有什么更新，主要是切换版本号。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="主要内容"&gt;主要内容&lt;/h2&gt;
&lt;p&gt;本次为版本发布，更新内容参考5.1.1&lt;/p&gt;
&lt;h2 id="提升"&gt;提升&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTP(S) Test Script Recorder 会在名字后追加数字显示，参考&lt;a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63450"&gt;Bug 64350&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;修复：当在XPath表达式中使用XPath Assertion返回Boolean值时，True if nothing matches没有生效并返回值为True。参考&lt;a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63455"&gt;Bug 63455&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XML现在拒绝不安全的XMl内容，会影响
&lt;ul&gt;
&lt;li&gt;XMLAssertion&lt;/li&gt;
&lt;li&gt;XMLSchemAssertion&lt;/li&gt;
&lt;li&gt;XPath function&lt;/li&gt;
&lt;li&gt;XPath 1 &amp;amp; 2 Extractors&lt;/li&gt;
&lt;li&gt;XPath 1 &amp;amp; 2 Assertions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="版本下载"&gt;版本下载&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/apache/jmeter/archive/v5.2-rc1.zip"&gt;JMeter5.2&lt;/a&gt;&lt;/p&gt;</description></item><item><title>JMeter历史版本更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeterUpdateHistory/</link><pubDate>Sat, 30 Mar 2019 18:00:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeterUpdateHistory/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;将自己翻译的JMeter历史版本的更新记录进行汇总，方便后期查阅。
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;JMeter版本&lt;/th&gt;
&lt;th&gt;发布时间&lt;/th&gt;
&lt;th&gt;更新内容&lt;/th&gt;
&lt;th&gt;下载地址&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5.2.1&lt;/td&gt;
&lt;td&gt;20191113&lt;/td&gt;
&lt;td&gt;[更新内容](&lt;a href="http://shiyuanjie.cn/2019/01/11/JMeter5.2.1/"&gt;http://shiyuanjie.cn/2019/01/11/JMeter5.2.1/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/archive/v5.2.1-rc1.zip"&gt;https://github.com/apache/jmeter/archive/v5.2.1-rc1.zip&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;20191008&lt;/td&gt;
&lt;td&gt;[更新内容](&lt;a href="http://shiyuanjie.cn/2019/01/08/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;http://shiyuanjie.cn/2019/01/08/JMeter5.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/archive/v5.2-rc1.zip"&gt;https://github.com/apache/jmeter/archive/v5.2-rc1.zip&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1.1&lt;/td&gt;
&lt;td&gt;20190314&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2019/03/20/JMeter5.1.1/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v5_1_1"&gt;https://github.com/apache/jmeter/releases/tag/v5_1_1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;td&gt;20190219&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2019/03/19/JMeter5.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v5_1"&gt;https://github.com/apache/jmeter/releases/tag/v5_1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;20180918&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2018/10/17/JMeter5.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v5_0"&gt;https://github.com/apache/jmeter/releases/tag/v5_0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;20180210&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2018/02/28/JMeter4.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v4_0"&gt;https://github.com/apache/jmeter/releases/tag/v4_0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;20170921&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2017/10/09/JMeter3.3%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v3_3"&gt;https://github.com/apache/jmeter/releases/tag/v3_3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;td&gt;20170414&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2017/05/13/JMeter3.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v3_2"&gt;https://github.com/apache/jmeter/releases/tag/v3_2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;td&gt;20161120&lt;/td&gt;
&lt;td&gt;&lt;a href="http://shiyuanjie.cn/2017/03/09/JMeter3.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/"&gt;更新内容&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter/releases/tag/v3_1"&gt;https://github.com/apache/jmeter/releases/tag/v3_1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>JMeter5.1.1更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter5.1.1/</link><pubDate>Wed, 20 Mar 2019 09:00:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter5.1.1/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;此版本主要用于BUG修复
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="实时报告和测试报告"&gt;实时报告和测试报告&lt;/h2&gt;
&lt;p&gt;在&lt;code&gt;工具&lt;/code&gt;菜单中，新增直接通过&lt;code&gt;CS/JTL&lt;/code&gt;文件来生成测试报告.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Menu_Generate_Report" loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/5.1.1/01_menu_generate_report.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Select_File to Generate_Report" loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/5.1.1/02_windows_generate_report.png"&gt;&lt;/p&gt;</description></item><item><title>JMeter5.1更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter5.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Tue, 19 Mar 2019 20:00:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter5.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;h2 id="核心能力提升"&gt;核心能力提升&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JDBC测试已被提升，可以直接设置SQL语句并支持查询超时功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="JDBC Connection" loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/5.1/jdbc-connection-config-init-request.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;变量问题已被修复，像使用&lt;code&gt;HTTP(S) Test Script Recorder&lt;/code&gt;录制HTTPS请求时收集正确的请求头信息。&lt;/li&gt;
&lt;li&gt;在5.0版本中，JMeter已调整使用自定义的命令策略来重命名子结果(&lt;a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=62550"&gt;BUG_62550&lt;/a&gt;)，这个变更对功能测试很麻烦，新的属性&lt;code&gt;subresults.disable_renaming=true&lt;/code&gt;用于解决这个问题。替代方法是使用在功能测试的测试计划中校验(&lt;a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=63055"&gt;BUG_63055&lt;/a&gt;)。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JMeter5.0更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter5.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Wed, 17 Oct 2018 15:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter5.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;p&gt;&lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;官方在&lt;code&gt;20180918&lt;/code&gt;发布了JMeter 5.0版本，主要涉及的更新内容如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新增&lt;code&gt;XPath2 extractor&lt;/code&gt;元素，用于XML处理&lt;/li&gt;
&lt;li&gt;增强&lt;code&gt;Flow Control Action&lt;/code&gt; &lt;code&gt;Result Status Action Handler&lt;/code&gt;控制器的能力&lt;/li&gt;
&lt;li&gt;强化搜索功能，便于在编写JMeter过程中进行搜索&lt;/li&gt;
&lt;li&gt;强化&lt;code&gt;录制功能&lt;/code&gt;，使用顶部悬浮的特点，便于对录制过程的处理&lt;/li&gt;
&lt;li&gt;UI界面中，新增&lt;code&gt;重启&lt;/code&gt;功能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HTML Web&lt;/code&gt;报告中，新增&lt;code&gt;实时&lt;/code&gt;吞吐量显示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HTML Web&lt;/code&gt;报告中，新增&lt;code&gt;Custom Graphs section&lt;/code&gt;用于个性化图表定制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;原文链接：&lt;a href="http://jmeter.apache.org/changes.html"&gt;http://jmeter.apache.org/changes.html&lt;/a&gt;
JMeter5.0下载：&lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;http://jmeter.apache.org/download_jmeter.cgi&lt;/a&gt;&lt;/p&gt;</description></item><item><title>构建Headless 的 E2E 测试</title><link>https://shiyuanjie.cn/posts/UITest/%E5%A6%82%E4%BD%95%E6%9E%84%E5%BB%BA-Headless-%E7%9A%84-E2E-%E6%B5%8B%E8%AF%95/</link><pubDate>Fri, 02 Mar 2018 12:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/%E5%A6%82%E4%BD%95%E6%9E%84%E5%BB%BA-Headless-%E7%9A%84-E2E-%E6%B5%8B%E8%AF%95/</guid><description>&lt;h2 id="为什么要构建-headless-的-e2e-测试"&gt;为什么要&lt;code&gt;构建 Headless 的 E2E 测试&lt;/code&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;A headless browser is a great tool for automated testing and server environments where you don&amp;#39;t need a visible UI shell. For example, you may want to run some tests against a real web page, create a PDF of it, or just inspect how the browser renders an URL.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;结合上面的原因，我们还可以&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Headless结合 E2E 测试，可以让E2E 测试在非 GUI 的操作系统中运行&lt;/li&gt;
&lt;li&gt;可以集成至 CI 环境中。让版本得到快速验证&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chrome-headless-的选取"&gt;Chrome Headless 的选取&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mac/Linux 的Chrome从59版本后，已经支持 Healess 模式的运行。Windows 的从60版本开始支持&lt;/li&gt;
&lt;li&gt;所以选择一个你想要的 Chrome 版本，便可以进行 Headless 的测试&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;chrome \
--headless \ # Runs Chrome in headless mode.
--disable-gpu \ # Temporarily needed if running on Windows.
https://www.chromestatus.com # URL to open. Defaults to about:blank.
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>JMeter4.0更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter4.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Wed, 28 Feb 2018 15:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter4.0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;等了这么久，20180210，终于有较大的更新。无论是从 UI 还是功能优化，都让人耳目一新。下面我们就详细看下具体变化。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;原文地址：&lt;a href="http://jmeter.apache.org/changes.html"&gt;http://jmeter.apache.org/changes.html&lt;/a&gt;
下载地址：&lt;a href="http://ftp.cuhk.edu.hk/pub/packages/apache.org//jmeter/binaries/apache-jmeter-4.0.zip"&gt;apache-jmeter-4.0.zip&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="重要更新"&gt;重要更新&lt;/h2&gt;
&lt;h3 id="主要变更"&gt;主要变更&lt;/h3&gt;
&lt;p&gt;JMeter 现在支持 JAVA 9.&lt;/p&gt;
&lt;p&gt;新的&lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#Boundary_Extractor"&gt;Boundary Extractor&lt;/a&gt;元素可以提供更好的元素提取性能&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/4.0/boundary_extractor.png"&gt;&lt;/p&gt;
&lt;p&gt;新的&lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion"&gt;JSON Assertion&lt;/a&gt;元素可用于 JSON 响应的断言。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/4.0/json_assertion.png"&gt;&lt;/p&gt;
&lt;p&gt;JMS Point-to-Point 样例增加了&lt;strong&gt;read,browser,clear&lt;/strong&gt;选项。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/4.0/jmsptp_communication_styles.png"&gt;&lt;/p&gt;</description></item><item><title>JMeter3.3更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter3.3%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Mon, 09 Oct 2017 10:50:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter3.3%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2017.9.21&lt;/code&gt;，JMeter3.3版本发布。&lt;/li&gt;
&lt;li&gt;原文地址：&lt;a href="http://jmeter.apache.org/changes.html"&gt;Apache JMeter 3.3 Release Notes &lt;/a&gt;,历史版本变更记录&lt;a href="http://jmeter.apache.org/changes_history.html"&gt;http://jmeter.apache.org/changes_history.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;下载地址： &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;Download Apache JMeter 3.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="重要变更"&gt;重要变更&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;JMeter 还不支持 Java9，下个版本将会支持，你可以给出帮助并查看此跟踪记录[Bug 61529](https://bz.apache.org/bugzilla/show_bug.cgi?id=61529)。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;建议：使用最新版本的 Java8 ，避免出现 JDK 的问题。
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="主要提升"&gt;主要提升&lt;/h3&gt;
&lt;p&gt;HTTP 样例支持&lt;a href="https://news.ycombinator.com/item?id=10257305"&gt;Brotli&lt;/a&gt;解压算法。&lt;/p&gt;
&lt;p&gt;CacheManager 现在完全支持变量头方式。&lt;/p&gt;
&lt;p&gt;InfluxDB BackendListener 现在支持通过 UDP 协议发送结果至 InfluxDB。&lt;/p&gt;
&lt;p&gt;&lt;img alt="InfluxDB BackendListener" loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/3.3/influxdb_udp.png"&gt;&lt;/p&gt;
&lt;p&gt;已经被增强来通过响应状态码和消息针对每一个 Transaction 发送错误数量。&lt;/p&gt;
&lt;p&gt;TCP 样例现在可以计算延迟，详情查看&lt;a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=60156"&gt;Bug 60156&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;更新依赖至最新版本，用于提升性能和修复 BUG。&lt;/p&gt;
&lt;p&gt;持续提升代码质量和测试覆盖率。查看&lt;a href="https://builds.apache.org/analysis/overview?id=12927"&gt;质量报告&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Responsive测试</title><link>https://shiyuanjie.cn/posts/UITest/Responsive%E6%B5%8B%E8%AF%95/</link><pubDate>Thu, 03 Aug 2017 15:30:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/Responsive%E6%B5%8B%E8%AF%95/</guid><description>&lt;h1 id="responsive测试"&gt;Responsive测试&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;如何使用Galen进行&lt;code&gt;响应式测试&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用Javascript编写测试代码&lt;/li&gt;
&lt;li&gt;完整代码：&lt;a href="https://github.com/aimer1124/GalenDemo"&gt;https://github.com/aimer1124/GalenDemo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h2 id="安装galen"&gt;安装Galen&lt;/h2&gt;
&lt;h3 id="通过npm安装"&gt;通过NPM安装&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo npm install -g galenframework-cli
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="检查安装版本galen--v"&gt;检查安装版本&lt;code&gt;galen -v&lt;/code&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ GalenDemo git:(master) ✗ galen -v
Galen Framework
Version: 2.3.4
JavaScript executor: Rhino 1.7 release 5 2015 01 29
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="第一步"&gt;第一步&lt;/h2&gt;
&lt;h3 id="创建测试文件存放于teststep1testjs"&gt;创建测试文件，存放于&lt;code&gt;test/step1.test.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;test(&amp;#34;First test&amp;#34;, function () {
console.log(&amp;#39;This is first test&amp;#39;)
});
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="执行测试"&gt;执行测试&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ GalenDemo git:(master) ✗ galen test test/*.js
========================================
Test: First test
========================================
This is first test
========================================
----------------------------------------
========================================
Suite status: PASS
Total tests: 1
Total failed tests: 0
Total failures: 0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="第二步"&gt;第二步&lt;/h2&gt;
&lt;h2 id="添加多个不同的设备用于测试兼容性"&gt;添加多个不同的设备，用于测试兼容性&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;this.devices = {
mobile: {
deviceName: &amp;#34;mobile&amp;#34;,
size: &amp;#34;400x700&amp;#34;
},
tablet: {
deviceName: &amp;#34;tablet&amp;#34;,
size: &amp;#34;600x800&amp;#34;
},
desktop: {
deviceName: &amp;#34;desktop&amp;#34;,
size: &amp;#34;1024x768&amp;#34;
}
};
forAll(devices, function (device) {
test(&amp;#34;Home page on ${deviceName}&amp;#34;, function (device){
var driver = createDriver(&amp;#34;http://galenframework.com&amp;#34;,
device.size,
&amp;#34;chrome&amp;#34;);
console.log(device.size)
});
});
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="查看测试结果"&gt;查看测试结果&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ GalenDemo git:(master) ✗ galen test test/*.js
========================================
Test: Home page on mobile
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 10344
Only local connections are allowed.
Aug 01, 2017 2:34:11 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
400x700
========================================
Test: Home page on tablet
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 6454
Only local connections are allowed.
Aug 01, 2017 2:34:17 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
600x800
========================================
Test: Home page on desktop
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 42862
Only local connections are allowed.
Aug 01, 2017 2:34:23 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
1024x768
========================================
----------------------------------------
========================================
Suite status: PASS
Total tests: 3
Total failed tests: 0
Total failures: 0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="第三步-引入gspec文件来难页面布局"&gt;第三步 引入&lt;code&gt;gspec&lt;/code&gt;文件，来难页面布局&lt;/h2&gt;
&lt;h3 id="新增specshome-pagegspec"&gt;新增&lt;code&gt;specs/home-page.gspec&lt;/code&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@objects
header id header
= Main section =
header:
height 5 to 100px
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="在测试脚本step3testjs中添加layout检查"&gt;在测试脚本&lt;code&gt;step3.test.js&lt;/code&gt;中添加Layout检查&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; test(&amp;#34;Home page on ${deviceName}&amp;#34;, function (device){
var driver = createDriver(&amp;#34;http://samples.galenframework.com/tutorial1/tutorial1.html&amp;#34;,
device.size,
&amp;#34;chrome&amp;#34;);
checkLayout(driver, &amp;#34;GalenDemo/home-page.gspec&amp;#34;, [device.deviceName]);
});
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加关闭浏览器"&gt;添加关闭浏览器&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;driver.close();
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加页面pageobject"&gt;添加页面&lt;code&gt;pageObject&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增&lt;code&gt;pageObject&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;this.home = $page(&amp;#34;home&amp;#34;, {
content: &amp;#34;div#content&amp;#34;
});
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;测试中引用&lt;code&gt;pageObject&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; var homepage = new home(driver);
if (!homepage.content.exists()){
console.log(&amp;#34;Content element don&amp;#39;t exist&amp;#34;)
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="第四步-不同分辨率下layout测试及生成测试报告"&gt;第四步 不同分辨率下Layout测试及生成测试报告&lt;/h2&gt;
&lt;h3 id="不同分辨率测试"&gt;不同分辨率测试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重新调整设备配制信息&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;function Device(deviceName, size, tags) {
this.deviceName = deviceName;
this.size = size;
this.tags = tags;
}
this.devices = {
mobile: new Device(&amp;#34;mobile&amp;#34;, &amp;#34;450x700&amp;#34;, [&amp;#34;mobile&amp;#34;]),
tablet: new Device(&amp;#34;tablet&amp;#34;, &amp;#34;600x800&amp;#34;, [&amp;#34;tablet&amp;#34;]),
desktop: new Device(&amp;#34;desktop&amp;#34;, &amp;#34;1024x768&amp;#34;, [&amp;#34;desktop&amp;#34;])
};
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;修改&lt;code&gt;layout&lt;/code&gt;测试中的设备&lt;code&gt;辨别和测试&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; @on *
header:
height 5 to 100px
@on tablet
content:
width 600px
@on desktop
content:
width 1024px
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="生成测试报告"&gt;生成测试报告&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ GalenDemo git:(master) ✗ galen test test/step3.test.js --htmlreport ./report
========================================
Test: Home page on mobile
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 36316
Only local connections are allowed.
Aug 03, 2017 2:56:04 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
= Main section =
header:
height 5 to 100px
========================================
Test: Home page on tablet
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 28325
Only local connections are allowed.
Aug 03, 2017 2:56:07 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
= Main section =
header:
height 5 to 100px
content:
width 600px
========================================
Test: Home page on desktop
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 12177
Only local connections are allowed.
Aug 03, 2017 2:56:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
= Main section =
header:
height 5 to 100px
content:
width 1024px
========================================
----------------------------------------
========================================
Suite status: PASS
Total tests: 3
Total failed tests: 0
Total failures: 0
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;从日志中可以查看到，每次在不同&lt;code&gt;设备&lt;/code&gt;测试时&lt;code&gt;layout&lt;/code&gt;代码已变更&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Test: Home page on desktop
========================================
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 12177
Only local connections are allowed.
Aug 03, 2017 2:56:10 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
= Main section =
header:
height 5 to 100px
content:
width 1024px
========================================
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://galenframework.com/"&gt;http://galenframework.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://galenframework.com/docs/reference-javascript-tests-guide/"&gt;http://galenframework.com/docs/reference-javascript-tests-guide/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>什么是Locust</title><link>https://shiyuanjie.cn/posts/Locust/%E4%BB%80%E4%B9%88%E6%98%AFLocust/</link><pubDate>Thu, 08 Jun 2017 18:30:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/Locust/%E4%BB%80%E4%B9%88%E6%98%AFLocust/</guid><description>&lt;ul&gt;
&lt;li&gt;原文地址：&lt;a href="http://docs.locust.io/en/latest/what-is-locust.html#"&gt;http://docs.locust.io/en/latest/what-is-locust.html#&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="什么是locust"&gt;什么是Locust&lt;/h2&gt;
&lt;p&gt;Locust是一个容易使用、分布式的压力测试工具。它是用于网站压力测试(或其它系统)并找出多少用户一个系统可以承载。&lt;/p&gt;
&lt;p&gt;在测试过程中，策略就是一个Locust的蠕虫将会攻击你的网站。每一个locust的行为(或你使用的测试用户)是你自己定义的，并且蠕虫进程从一个网页视图中被实时监测。这样会帮助你来实现测试，在真实用户使用前定义系统的瓶颈。&lt;/p&gt;
&lt;p&gt;Locust是完全基于事件的，因此可以在单台机器中支持数以千计的用户在线。和其它基于事件的程序相比较，它是不需要使用回调的。相反，它通过&lt;a href="http://www.gevent.org/"&gt;gevent&lt;/a&gt;使用轻量级的进程。每一个locust测试你的网站时，实际上是真实的在内部运行它自己的进程(或greenlet,准确的说)。这样就允许你不使用复杂的回调方法，而是使用Python编写复杂的场景。&lt;/p&gt;</description></item><item><title>分布式测试</title><link>https://shiyuanjie.cn/posts/Locust/Locust%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95/</link><pubDate>Sat, 03 Jun 2017 21:30:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/Locust/Locust%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95/</guid><description>&lt;h2 id="分布式运行locust"&gt;分布式运行Locust&lt;/h2&gt;
&lt;p&gt;一旦单台机器不够模拟足够多的用户时，Locust支持运行在多台机器中进行压力测试。&lt;/p&gt;
&lt;p&gt;为了实现这个，你应该在&lt;code&gt;master&lt;/code&gt;模式中使用&lt;code&gt;--master&lt;/code&gt;标记来启用一个Locust实例。这个实例将会运行你启动测试的Locust交互网站并查看实时统计数据。&lt;code&gt;master&lt;/code&gt;节点的机器自身不会模拟任何用户。相反，你必须使用&lt;code&gt;--slave&lt;/code&gt;标记启动一台到多台Locust&lt;code&gt;slave&lt;/code&gt;机器节点，与标记&lt;code&gt;--master-host&lt;/code&gt;一起使用(指出&lt;code&gt;master&lt;/code&gt;机器的&lt;code&gt;IP/hostname&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;常用的做法是在一台独立的机器中运行master，在&lt;code&gt;slave&lt;/code&gt;机器中每个处理器内核运行一个&lt;code&gt;slave&lt;/code&gt;实例。&lt;/p&gt;
&lt;p&gt;** !Note **&lt;/p&gt;
&lt;p&gt;** &lt;code&gt;master&lt;/code&gt;和每一台&lt;code&gt;slave&lt;/code&gt;机器，在运行分布式测试时都&lt;code&gt;必须&lt;/code&gt;要有locust的测试文件。**&lt;/p&gt;</description></item><item><title>编写一个Locust文件</title><link>https://shiyuanjie.cn/posts/Locust/%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AALocust%E6%96%87%E4%BB%B6/</link><pubDate>Fri, 02 Jun 2017 21:30:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/Locust/%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AALocust%E6%96%87%E4%BB%B6/</guid><description>&lt;p&gt;Locust文件就是一般的Python文件。唯一的需求就是它至少需要一个继承于&lt;code&gt;Locust&lt;/code&gt;的类.&lt;/p&gt;
&lt;h2 id="locust类"&gt;Locust类&lt;/h2&gt;
&lt;p&gt;Locust类代表一个用户(如果愿意，也可以是一个准备出动的蝗虫)。Locust会为每一个模拟用户生成一个locust类实例。同时会有一些locust类属性被定义。&lt;/p&gt;
&lt;h3 id="task_set属性"&gt;&lt;code&gt;task_set&lt;/code&gt;属性&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;task_set&lt;/code&gt;属性是指向一个定义用户行为的&lt;code&gt;TaskSet&lt;/code&gt;类，下面会有详细的介绍。&lt;/p&gt;
&lt;h3 id="min_wait和max_wait属性"&gt;&lt;code&gt;min_wait&lt;/code&gt;和&lt;code&gt;max_wait&lt;/code&gt;属性&lt;/h3&gt;
&lt;p&gt;除了&lt;code&gt;task_set&lt;/code&gt;属性，另外一个经常被使用的就是&lt;code&gt;min_wait&lt;/code&gt;和&lt;code&gt;max_wait&lt;/code&gt;属性。是用于各自以毫秒为单位的最小值和最大值，一个模拟用户将会在每个任务执行时的等待执行的时间间隔。&lt;code&gt;min_wait&lt;/code&gt;和&lt;code&gt;max_wait&lt;/code&gt;默认设置为&lt;code&gt;1000&lt;/code&gt;，如果不声明的话，Locust会默认在每个任务间等待&lt;code&gt;1秒&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;参考下面的代码，每个用户将会在每个任务间等待&lt;code&gt;5至15&lt;/code&gt;秒:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from locust import Locust, TaskSet, task_set
class MyTaskSet(TaskSet):
@task
def my_task(self):
print &amp;#34;executing my_task&amp;#34;
class MyLocust(Locust):
task_set = MyTaskSet
min_wait = 5000
max_wait = 15000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;min_wait&lt;/code&gt;和&lt;code&gt;max_wait&lt;/code&gt;属性可以用于重写&lt;code&gt;TaskSet&lt;/code&gt;类。&lt;/p&gt;</description></item><item><title>Locust快速入门</title><link>https://shiyuanjie.cn/posts/Locust/Locust%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/</link><pubDate>Wed, 24 May 2017 18:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/Locust/Locust%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;Locust，基于Python的性能测试工具。
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.locust.io/en/latest/what-is-locust.html"&gt;什么是Locust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;本文&lt;a href="http://locust.io/"&gt;Locust&lt;/a&gt;版本&lt;code&gt;0.7.5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;原文地址：&lt;a href="http://docs.locust.io/en/latest/quickstart.html#"&gt;http://docs.locust.io/en/latest/quickstart.html#&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="示例locustfilepy"&gt;示例&lt;code&gt;locustfile.py&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;下面是一个简单的&lt;code&gt;locustfile.py&lt;/code&gt;小示例:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from locust import HttpLocust, TaskSet
def login(l):
l.client.post(&amp;#34;/login&amp;#34;, {&amp;#34;username&amp;#34;:&amp;#34;ellen_key&amp;#34;, &amp;#34;password&amp;#34;:&amp;#34;education&amp;#34;})
def index(l):
l.client.get(&amp;#34;/&amp;#34;)
def profile(l):
l.client.get(&amp;#34;/profile&amp;#34;)
class UserBehavior(TaskSet):
tasks = {index: 2, profile: 1}
def on_start(self):
login(self)
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 5000
max_wait = 9000
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>JMeter3.2更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter3.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Sat, 13 May 2017 14:50:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter3.2%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2017.4.14&lt;/code&gt;，JMeter3.2版本发布。&lt;/li&gt;
&lt;li&gt;原文地址：&lt;a href="http://jmeter.apache.org/changes.html"&gt;Apache JMeter 3.2 Release Notes &lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;下载地址： &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;Download Apache JMeter 3.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="重要变更"&gt;重要变更&lt;/h2&gt;
&lt;p&gt;JMeter现在需要&lt;code&gt;Java8&lt;/code&gt;。确保你使用的最新版本的Java。
JMeter日志已经被迁移至SLF4J和Log4j 2。这个影响配制和第三方插件，查看下面的『日志变更』.
在使用JMeter的3.2版本时，在结果树中的结果数里从默认修改为500.如果你想查看更多，必须修改属性&lt;code&gt;view.results.tree.max_results&lt;/code&gt;为一个更高的数值或者你不想限制数量可改为0。你可以在&lt;code&gt;bin/user.properties&lt;/code&gt;中设置。更多的信息可查看&lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#View_Results_Tree"&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="主要提升"&gt;主要提升&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JMeter现在提供一个新的&lt;code&gt;BackendListener&lt;/code&gt;与&lt;code&gt;InfluxDB&lt;/code&gt;交互
&lt;img alt="BackendListener" loading="lazy" src="http://jmeter.apache.org/images/screenshots/changes/3.2/backend_influxdb.png"&gt;
这个功能使用异步的HTTP请求发送数据至InfluxDB通过&lt;a href="https://docs.influxdata.com/influxdb/v1.2/guides/writing_data/"&gt;HTTP API&lt;/a&gt;并提供下面的图形展示结果
&lt;img alt="Graph" loading="lazy" src="http://jmeter.apache.org/images/screenshots/backend_listener_influxdb_graph.png"&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JMeter3.1更新内容</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter3.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</link><pubDate>Thu, 09 Mar 2017 16:30:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter3.1%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;2016.11.20&lt;/code&gt;，&lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;官网已经正式发布了3.1的版本，今天尝试翻译下更新内容，内容中肯定还有很多不足，希望大家多多谅解。&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;原文地址：&lt;a href="http://jmeter.apache.org/changes.html"&gt;Apache JMeter 3.1 Release Notes &lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;下载地址： &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;Download Apache JMeter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="提升报告和仪表盘"&gt;提升报告和仪表盘&lt;/h2&gt;
&lt;p&gt;仪表盘新增三个图表和一个概要表格&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;连接时间
&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/dashboard/report_connect_time_over_time.png"&gt;&lt;/li&gt;
&lt;li&gt;成功百分比响应时间
&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/dashboard/response_time_percentiles_over_time.png"&gt;&lt;/li&gt;
&lt;li&gt;响应时间分布
&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/dashboard/response_time_overview.png"&gt;&lt;/li&gt;
&lt;li&gt;执行样例中的错误Top5
&lt;img loading="lazy" src="http://jmeter.apache.org/images/screenshots/dashboard/top_5_errors_by_sampler.png"&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>性能测试-JMeter入门手册</title><link>https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95-JMeter%E5%85%A5%E9%97%A8/</link><pubDate>Tue, 28 Feb 2017 16:15:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95-JMeter%E5%85%A5%E9%97%A8/</guid><description>&lt;p&gt;&lt;a href="https://github.com/aimer1124/jmeter-tutorial"&gt;Github地址(源文件及脚本)&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="本文目的--build-status"&gt;本文目的 &lt;a href="https://travis-ci.org/aimer1124/jmeter-tutorial"&gt;&lt;img alt="Build Status" loading="lazy" src="https://travis-ci.org/aimer1124/jmeter-tutorial.svg?branch=master"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;面向新手，学习后可以使用&lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;&lt;strong&gt;独立&lt;/strong&gt;完成项目的性能测试&lt;/li&gt;
&lt;li&gt;快速分析并使用&lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;定位出项目&lt;strong&gt;性能测试结果&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;产出&lt;strong&gt;有价值&lt;/strong&gt;的性能测试报告&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="目录"&gt;目录&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/README.html"&gt;简介&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter1/README.html"&gt;认识JMeter&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter1/%E4%BA%86%E8%A7%A3%E5%B9%B6%E5%90%AF%E5%8A%A8JMeter.html"&gt;了解并启动JMeter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter1/%E8%AE%A4%E8%AF%86JMeter.html"&gt;认识JMeter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter1/%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95.html"&gt;第一个测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter2/README.html"&gt;提高JMeter&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter2/%E7%BA%BF%E7%A8%8B%E9%AB%98%E5%B9%B6%E5%8F%91.html"&gt;线程高并发&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter2/%E9%80%BB%E8%BE%91%E6%8E%A7%E4%BB%B6%E5%99%A8.html"&gt;逻辑控件器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter2/%E6%96%AD%E8%A8%80%E6%B5%8B%E8%AF%95.html"&gt;断言测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter2/%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90.html"&gt;结果分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter3/README.html"&gt;完善JMeter&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter3/HTTP%E4%BF%A1%E6%81%AF%E5%A4%B4%E7%AE%A1%E7%90%86.html"&gt;HTTP信息头管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter3/%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96.html"&gt;数据获取&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter3/%E5%AE%9E%E6%88%98%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.html"&gt;实战性能测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter4/README.html"&gt;分析测试&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter4/%E6%96%AD%E8%A8%80%E7%BB%93%E6%9E%9C%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90.html"&gt;断言结果详细分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter4/%E7%BB%93%E6%9E%9C%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90.html"&gt;结果详细分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter4/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%88%86%E6%9E%90.html"&gt;服务器分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter4/%E6%89%A9%E5%B1%95%E6%8F%92%E4%BB%B6.html"&gt;扩展插件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter5/README.html"&gt;进阶使用&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter5/%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%89%A7%E8%A1%8CJMeter.html"&gt;命令行执行JMeter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter5/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B8%B8%E7%94%A8%E4%B8%93%E4%B8%9A%E8%BF%B0%E8%AF%AD.html"&gt;性能测试常用专业述语&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter5/JMeter%E5%AE%98%E6%96%B9%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html"&gt;JMeter最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter5/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html"&gt;性能测试最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/chapter5/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.html"&gt;测试报告&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://aimer1124.github.io/jmeter-tutorial/end/README.html"&gt;结束语&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="说明"&gt;说明&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;基础环境信息：
&lt;ul&gt;
&lt;li&gt;OS:macOS Mojave 10.14.2&lt;/li&gt;
&lt;li&gt;JDK:11.0.1&lt;/li&gt;
&lt;li&gt;JMeter：5.2.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;QQ交流群：&lt;strong&gt;478527666&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;文中关于&lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;的功能，不会很详尽，&lt;strong&gt;够用足以&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;源GitBook地址:&lt;a href="https://aimer1124.gitbooks.io/jmeter-tutorial/content/"&gt;https://aimer1124.gitbooks.io/jmeter-tutorial/content/&lt;/a&gt;，停止更新&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JMeter与Docker</title><link>https://shiyuanjie.cn/posts/JMeter/jmeter%E4%B8%8EDocker/</link><pubDate>Wed, 25 Jan 2017 21:50:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/jmeter%E4%B8%8EDocker/</guid><description>&lt;h1 id="jmeter_docker"&gt;JMeter_docker&lt;/h1&gt;
&lt;p&gt;Use JMeter with Docker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;Demo.jmx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change the following about &lt;code&gt;Demo.jmx&lt;/code&gt; file&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;COPY Demo.jmx /opt/jmeter
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;build Docker file in root folder&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker build -t performanceDocker .
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;run docker with performance testing&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Layout测试</title><link>https://shiyuanjie.cn/posts/UITest/Layout%E6%B5%8B%E8%AF%95/</link><pubDate>Mon, 28 Nov 2016 15:40:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/Layout%E6%B5%8B%E8%AF%95/</guid><description>&lt;p&gt;Web页面Layout测试，一直是测试人员比较头疼的事情。原因有&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前市面中设备的&lt;code&gt;分辨率&lt;/code&gt;千差万别&lt;/li&gt;
&lt;li&gt;浏览器版本众多，工作量很大&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如何使用&lt;code&gt;高效&lt;/code&gt;的方式来测试Web Layout是否能正常，下面来看下&lt;a href="http://galenframework.com/"&gt;Galen&lt;/a&gt;是如何帮助我们的&lt;/p&gt;
&lt;h2 id="galen的特点"&gt;&lt;a href="http://galenframework.com/"&gt;Galen&lt;/a&gt;的特点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;开源项目，License基于&lt;a href="http://www.apache.org/licenses/LICENSE-2.0"&gt;Apache License, Version 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;可测试页面布局、响应式设计，支持功能测试&lt;/li&gt;
&lt;li&gt;基于&lt;a href="http://www.seleniumhq.org/"&gt;Selenium&lt;/a&gt;，对Selenium Grid支持很好，可直接在&lt;a href="https://saucelabs.com/"&gt;Sauce Labs&lt;/a&gt;和 &lt;a href="https://www.browserstack.com/"&gt;BrowserStack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;支持并行测试，减少测试时间&lt;/li&gt;
&lt;li&gt;语法简洁&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PageObject分离E2E测试</title><link>https://shiyuanjie.cn/posts/UITest/PageObject%E5%88%86%E7%A6%BBE2E%E6%B5%8B%E8%AF%95/</link><pubDate>Thu, 24 Nov 2016 14:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/PageObject%E5%88%86%E7%A6%BBE2E%E6%B5%8B%E8%AF%95/</guid><description>&lt;h2 id="pageobject"&gt;PageObject&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com"&gt;老马&lt;/a&gt;关于&lt;a href="http://martinfowler.com/bliki/PageObject.html"&gt;PageObject&lt;/a&gt;的定义&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;It should allow a software client to do anything and see anything that a human can&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;PageObject到底是个啥&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;将针对Page的&lt;code&gt;所有操作&lt;/code&gt;进行&lt;code&gt;统一&lt;/code&gt;封装，如: 输入框中输入内容、点击按钮等&lt;/p&gt;&lt;/blockquote&gt;</description></item><item><title>MAC制作GIF及设置GIF循环播放</title><link>https://shiyuanjie.cn/posts/UITest/Mac%E5%88%B6%E4%BD%9CGIF%E5%8F%8A%E8%AE%BE%E7%BD%AEGIF%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE/</link><pubDate>Wed, 23 Nov 2016 16:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/Mac%E5%88%B6%E4%BD%9CGIF%E5%8F%8A%E8%AE%BE%E7%BD%AEGIF%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE/</guid><description>&lt;blockquote&gt;
&lt;p&gt;需求：在Mac电脑中录制操作，并生成GIF文件。GIF文件需要循环播放。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id="工具选择"&gt;工具选择&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://recordit.co/"&gt;Recordit&lt;/a&gt;，7.2M大小，Free&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lcdf.org/gifsicle/"&gt;gifsicle&lt;/a&gt;，&lt;code&gt;加工&lt;/code&gt;GIF图片工具&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Espresso入门</title><link>https://shiyuanjie.cn/posts/UITest/Espresso%E5%85%A5%E9%97%A8/</link><pubDate>Wed, 23 Nov 2016 14:20:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/Espresso%E5%85%A5%E9%97%A8/</guid><description>&lt;h2 id="espresso"&gt;Espresso&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Espresso是什么&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;由Google提供的开源native测试框架。支持所有版本的Android API.&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;如何测试
&lt;ul&gt;
&lt;li&gt;通过使用&lt;code&gt;Rule&lt;/code&gt;来获取&lt;code&gt;Activity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;针对&lt;code&gt;Activity&lt;/code&gt;中的元素进行操作，进而达到测试的目的
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/UITest/Espresso%E5%85%A5%E9%97%A8/Espresso%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86_hu_ad9e260d3948ea62.webp" type="image/webp"&gt;&lt;img alt="Espresso工作原理" loading="lazy" src="https://shiyuanjie.cn/posts/UITest/Espresso%E5%85%A5%E9%97%A8/Espresso%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86.png"&gt;&lt;/picture&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JMeter与BeanShell的化学反应</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter%E4%B8%8EBeanshell%E7%9A%84%E5%8C%96%E5%AD%A6%E5%8F%8D%E5%BA%94/</link><pubDate>Tue, 01 Nov 2016 15:53:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter%E4%B8%8EBeanshell%E7%9A%84%E5%8C%96%E5%AD%A6%E5%8F%8D%E5%BA%94/</guid><description>&lt;h2 id="jmeter是什么"&gt;JMeter是什么&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://jmeter.apache.org/"&gt;http://jmeter.apache.org/&lt;/a&gt;，性能测试工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于&lt;code&gt;Java&lt;/code&gt;的&lt;code&gt;开源&lt;/code&gt;性能测试工具&lt;/li&gt;
&lt;li&gt;支持测试的协议
&lt;ul&gt;
&lt;li&gt;Web - HTTP, HTTPS&lt;/li&gt;
&lt;li&gt;SOAP / REST&lt;/li&gt;
&lt;li&gt;FTP&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;LDAP&lt;/li&gt;
&lt;li&gt;Message-oriented middleware (MOM)&lt;/li&gt;
&lt;li&gt;Mail&lt;/li&gt;
&lt;li&gt;Native commands or shell scripts&lt;/li&gt;
&lt;li&gt;TCP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;支持多线程并发&lt;/li&gt;
&lt;li&gt;完善的GUI界面，用于快速设计测试计划和调试测试脚本&lt;/li&gt;
&lt;li&gt;完整测试结果，便于结果分析&lt;/li&gt;
&lt;li&gt;JMeter不会执行HTML中的JavaScript脚本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="beanshell是什么"&gt;BeanShell是什么&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://beanshell.org/"&gt;http://beanshell.org/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于&lt;code&gt;Java&lt;/code&gt;的免费解释器&lt;/li&gt;
&lt;li&gt;松散类型的脚本语言&lt;/li&gt;
&lt;li&gt;动态执行的Java代码&lt;/li&gt;
&lt;li&gt;只有150K大小的JAR包&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;BeanShell既然可以编写Java代码，那么我们就可以在使用JMeter测试的过程中，使用Java语法功能，且支持关键字&lt;code&gt;高亮&lt;/code&gt;，进行业务逻辑的处理，进而达到&lt;code&gt;场景&lt;/code&gt;功能的设计。&lt;/p&gt;&lt;/blockquote&gt;</description></item><item><title>JMeter-自动生成测试Report</title><link>https://shiyuanjie.cn/posts/JMeter/JMeter-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95Report/</link><pubDate>Fri, 23 Sep 2016 18:53:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/JMeter/JMeter-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95Report/</guid><description>&lt;h1 id="dashboard-report"&gt;Dashboard Report&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://jmeter.apache.org/changes.html"&gt;JMeter3.0&lt;/a&gt;版本发布后，开始支持&lt;code&gt;动态&lt;/code&gt;报表报告。让测试人员编写&lt;code&gt;性能测试报告&lt;/code&gt;更加容易。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;支持在&lt;code&gt;测试结束&lt;/code&gt;后，生成测试报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;导入&lt;/code&gt;之前测试结果，生成测试报告&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面就看下如何使用这个&lt;code&gt;新特性&lt;/code&gt;，生成测试报告&lt;/p&gt;</description></item><item><title>性能测试之远程并发模式</title><link>https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E4%B9%8B%E8%BF%9C%E7%A8%8B%E6%A8%A1%E5%BC%8F/</link><pubDate>Mon, 12 Sep 2016 19:15:38 +0800</pubDate><guid>https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E4%B9%8B%E8%BF%9C%E7%A8%8B%E6%A8%A1%E5%BC%8F/</guid><description>&lt;p&gt;事实上，你的JMeter客户端机器是不能表现出完美的压力请求，来模拟足够多的用户或由于网络限制去向服务施加压力，一种解决方法是通过一个JMeter去控制多个/远程JMeter。通过运行JMeter的远程模式，你可以通过多个低配制的电脑复制测试计划用于模拟一个大数据量的压力并发在服务器上。一个JMeter客户端实例可以控制多个远程JMeter实例，并收集所有数据信息。特点如下:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保存测试样例在本机电脑&lt;/li&gt;
&lt;li&gt;通过一台机器来管理多台JMeter测试机&lt;/li&gt;
&lt;li&gt;不需要复制测试计划到每一台JMeter测试机-JMeter客户端会发送至所有的服务器&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;提示: 相同的测试计划将会被运行在所有的服务器中。JMeter不会在服务器间分发压力，每一个均会完整执行测试计划。因此，如果你设置了1000个线程并有6个JMeter服务，你将会完成6000线程注入。&lt;/p&gt;&lt;/blockquote&gt;</description></item><item><title>性能测试最佳实践之JMeter</title><link>https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E4%B9%8BJMeter/</link><pubDate>Wed, 31 Aug 2016 20:45:38 +0800</pubDate><guid>https://shiyuanjie.cn/posts/PerformanceTest/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E4%B9%8BJMeter/</guid><description>&lt;h1 id="保持使用最新版本"&gt;保持使用最新版本&lt;/h1&gt;
&lt;p&gt;JMeter被经常推荐用来测试性能，鼓励用户使用最新的版本。&lt;/p&gt;
&lt;p&gt;确保你要经常去阅读&lt;a href="http://jmeter.apache.org/changes.html"&gt;变更记录&lt;/a&gt;中的新功能和模块的提升。你不应该再使用3.0之前的版本了&lt;/p&gt;
&lt;h1 id="使用正确的线程数"&gt;使用正确的线程数&lt;/h1&gt;
&lt;p&gt;你硬件设备的能力及测试计划将都会影响你的JMeter可运行的线程数。数量也依赖于你的服务有多快(一个可快速响应的服务可以让JMeter变更更加给力)。像其它性能测试工具一样，如果你没有正确的线程数，你将面对不准备或错误结果的&lt;code&gt;Coordinated Omission&lt;/code&gt;问题。如果你需要大数量级的压力测试，考虑使用分布式模式在多台机器上运行无GUI的JMeter实例。当使用分布式模式时，结果将被聚合在控制器的结果中，如果使用多个自已的实例，结果文件可以聚合用于持续性分析。对于如何在一个给定的平台上使用JMeter测试，&lt;code&gt;JavaTest Sampler&lt;/code&gt;可以考虑使用。它不需要任何网络请求便可返回一些信息在最大的吞吐量。&lt;/p&gt;
&lt;p&gt;JMeter有选项用于延迟线程创建直到线程正常启动，如在其它线程组延迟之后和线程自身的启动时间。这样就允许一个非常大数量级的线程数，不需要太多的线程同时并发。&lt;/p&gt;</description></item><item><title>E2E测试之Headless browser容器化</title><link>https://shiyuanjie.cn/posts/UITest/E2E%E6%B5%8B%E8%AF%95%E4%B9%8BHeadless-browser%E5%AE%B9%E5%99%A8%E5%8C%96/</link><pubDate>Mon, 01 Aug 2016 20:00:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/E2E%E6%B5%8B%E8%AF%95%E4%B9%8BHeadless-browser%E5%AE%B9%E5%99%A8%E5%8C%96/</guid><description>&lt;h1 id="目的"&gt;目的&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;E2E测试执行过程中&lt;strong&gt;不依赖UI&lt;/strong&gt;界面&lt;/li&gt;
&lt;li&gt;可在*nix系统中运行&lt;/li&gt;
&lt;li&gt;为什么不用&lt;code&gt;PhantomJS&lt;/code&gt;,&lt;a href="http://www.protractortest.org/#/browser-setup#setting-up-phantomjs"&gt;Protractor官方不推荐使用&lt;code&gt;PhantomJS&lt;/code&gt;来测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;We recommend against using PhantomJS for tests with Protractor. There are many reported issues with PhantomJS crashing and behaving differently from real browsers.
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="docker"&gt;Docker&lt;/h1&gt;
&lt;h2 id="安装"&gt;安装&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下载系统所需要的安装包，下载地址：&lt;a href="https://www.docker.com/products/docker"&gt;https://www.docker.com/products/docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;注册&lt;a href="https://hub.docker.com/"&gt;https://hub.docker.com/&lt;/a&gt;账号&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;pull&lt;/code&gt;来获取docker 镜像&lt;code&gt;protractor-headless&lt;/code&gt;，此过程会比较慢，耐心等待
docker hub地址：&lt;a href="https://hub.docker.com/r/webnicer/protractor-headless/"&gt;https://hub.docker.com/r/webnicer/protractor-headless/&lt;/a&gt;
git hub地址：&lt;a href="https://github.com/jciolek/docker-protractor-headless"&gt;https://github.com/jciolek/docker-protractor-headless&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker pull webnicer/protractor-headless
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>API开发神器-Postman</title><link>https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/</link><pubDate>Fri, 24 Jun 2016 19:50:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/</guid><description>&lt;p&gt;&lt;code&gt;Postman helps you develop APIs faster.&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="豪华午餐"&gt;豪华午餐&lt;/h1&gt;
&lt;p&gt;&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman_hu_df479b550738d4ad.webp" type="image/webp"&gt;&lt;img alt="Postman" loading="lazy" src="https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman.png"&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id="postman"&gt;Postman&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;构建、管理、文档化&lt;/code&gt;API&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在线安装&lt;/li&gt;
&lt;li&gt;Chrome插件版
&lt;a href="https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop"&gt;https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MAC版
&lt;a href="https://www.getpostman.com/app/postman-osx"&gt;https://www.getpostman.com/app/postman-osx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;离线安装
使用已经安装好的Postman文件夹，&lt;code&gt;机器&lt;/code&gt;默认存放目录：/Library/Application\ Support/Google/Chrome/Default/Extensions
进入&lt;code&gt;chrome://extensions/&lt;/code&gt;，选择&lt;code&gt;Load unpacked extensions&lt;/code&gt;，加载Postman的文件夹&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman-Newman_hu_fb0fb4153d86d0ae.webp" type="image/webp"&gt;&lt;img alt="Newman(我真的不是MP3)" loading="lazy" src="https://shiyuanjie.cn/posts/APITest/API%E5%BC%80%E5%8F%91%E7%A5%9E%E5%99%A8-Postman/Postman-Newman.png"&gt;&lt;/picture&gt;&lt;/p&gt;</description></item><item><title>如此Tricky的测试场景,你应该怎么办</title><link>https://shiyuanjie.cn/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/</link><pubDate>Sun, 22 May 2016 11:03:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/</guid><description>&lt;h1 id="什么是tricky的测试场景"&gt;什么是Tricky的测试场景？&lt;/h1&gt;
&lt;p&gt;&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/TestScenario-Tricky_hu_da8686bd7774d587.webp" type="image/webp"&gt;&lt;img alt="Tricky的测试场景" loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E5%A6%82%E6%AD%A4Tricky%E7%9A%84%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E4%BD%A0%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/TestScenario-Tricky.png"&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id="测试场景"&gt;测试场景&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Scenario testing&lt;/strong&gt; is a software &lt;strong&gt;testing&lt;/strong&gt; activity that uses &lt;strong&gt;scenarios&lt;/strong&gt;: hypothetical stories to help the tester work through a complex problem or &lt;strong&gt;test&lt;/strong&gt; system. The ideal &lt;strong&gt;scenario test&lt;/strong&gt; is a credible, complex, compelling or motivating story the outcome of which is easy to evaluate.&lt;/p&gt;</description></item><item><title>API自动化测试与持续集成</title><link>https://shiyuanjie.cn/posts/APITest/API%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E4%B8%8E%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/</link><pubDate>Tue, 10 May 2016 14:23:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/APITest/API%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E4%B8%8E%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/</guid><description>&lt;h1 id="目的"&gt;目的&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;如何使用&lt;code&gt;SuperTest&lt;/code&gt;测试框架，进行API测试&lt;/li&gt;
&lt;li&gt;如何将API测试与构建工具结合&lt;/li&gt;
&lt;li&gt;如何将API测试、构建工具与持续集成结合&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Protractor End to End Testing</title><link>https://shiyuanjie.cn/posts/UITest/Protractor-End-to-End-Testing/</link><pubDate>Thu, 28 Apr 2016 11:06:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/UITest/Protractor-End-to-End-Testing/</guid><description>&lt;h1 id="protractor"&gt;Protractor&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Protractor is an end-to-end test framework for AngularJS applications.
Protractor runs tests against your application running in a real browser, interacting with it as a user would.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="是什么"&gt;是什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基于&lt;code&gt;Node.js&lt;/code&gt;的程序&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;Jasmine&lt;/code&gt;测试框架测试接口,针对&lt;code&gt;AngularJS&lt;/code&gt;的应用程序&lt;/li&gt;
&lt;li&gt;官网： &lt;a href="http://angular.github.io/protractor/#/"&gt;http://angular.github.io/protractor/#/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/angular/protractor"&gt;https://github.com/angular/protractor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;模拟真实的用户操作行为&lt;/li&gt;
&lt;li&gt;针对&lt;code&gt;AngularJS&lt;/code&gt;中的Element不需要做特殊的处理，普通HTML元素也同样支持&lt;/li&gt;
&lt;li&gt;智能等待，不需要为页面中的加载和同步显示做特殊的等待时间处理&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SuperTestWithGulp</title><link>https://shiyuanjie.cn/posts/SuperTest/SuperTestWithGulp/</link><pubDate>Fri, 15 Apr 2016 15:51:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/SuperTest/SuperTestWithGulp/</guid><description>&lt;h1 id="gulp"&gt;Gulp&lt;/h1&gt;
&lt;p&gt;Automate and enhance your workflow&lt;/p&gt;
&lt;p&gt;&lt;code&gt;用自动化构建工具增强你的工作流程！&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官网：&lt;a href="http://gulpjs.com/"&gt;http://gulpjs.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中文官网：&lt;a href="http://www.gulpjs.com.cn/"&gt;http://www.gulpjs.com.cn/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;简体中文文档: &lt;a href="https://github.com/lisposter/gulp-docs-zh-cn"&gt;https://github.com/lisposter/gulp-docs-zh-cn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安装&lt;code&gt;npm install --global gulp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;验证&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ Downloads gulp -v
[15:59:38] CLI version 3.9.1
[15:59:38] Local version 3.9.1
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>游戏测试</title><link>https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/</link><pubDate>Sun, 03 Apr 2016 19:50:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/</guid><description>&lt;p&gt;&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.002_hu_586e53c04bcaef5b.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.002.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.003_hu_1dfe63f97a839824.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.003.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.004_hu_bc2c2b40b7e2eab5.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.004.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.005_hu_4a3f0eb370a4c66d.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.005.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.006_hu_153a925494ceb400.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.006.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.007_hu_58d7cd22e5e9e0be.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.007.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.008_hu_89ec004857f98b9a.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.008.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.009_hu_38de37ac9f09846f.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.009.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.010_hu_4a3f0eb370a4c66d.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.010.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.011_hu_ba0ac68fa0ec96f5.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.011.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.012_hu_6766ca1780ba4201.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.012.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.013_hu_6ea8e6f0e2bb174e.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.013.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.014_hu_ae133e5e7bc75863.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.014.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.015_hu_422da9f5e0c87d92.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.015.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.016_hu_66fef99c2cc15934.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.016.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.017_hu_886c9851e6916df4.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.017.jpeg"&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.018_hu_5950e70adf71a949.webp" type="image/webp"&gt;&lt;img loading="lazy" src="https://shiyuanjie.cn/posts/QA/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/BQConf_GameTest-20160403.018.jpeg"&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;PS:文档备案，以便以后查看&lt;/p&gt;</description></item><item><title>Http-Header</title><link>https://shiyuanjie.cn/posts/APITest/Http-Header/</link><pubDate>Mon, 29 Feb 2016 20:14:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/APITest/Http-Header/</guid><description>&lt;h1 id="header"&gt;Header&lt;/h1&gt;
&lt;h2 id="定义"&gt;定义&lt;/h2&gt;
&lt;p&gt;提供HTTP所需要的信息或发送的信息&lt;/p&gt;
&lt;p&gt;&lt;code&gt;HTTP header fields provide required information about the request or response, or about the object sent in the message body.&lt;/code&gt;&lt;/p&gt;</description></item><item><title>SuperTest-header:Auth设置</title><link>https://shiyuanjie.cn/posts/SuperTest/SuperTest-header-Auth%E8%AE%BE%E7%BD%AE/</link><pubDate>Sun, 28 Feb 2016 21:36:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/SuperTest/SuperTest-header-Auth%E8%AE%BE%E7%BD%AE/</guid><description>&lt;h1 id="supertest"&gt;SuperTest&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://aimer1124.github.io/2016/01/17/SuperTest/"&gt;SuperTest-API测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="auth分类"&gt;Auth分类&lt;/h1&gt;
&lt;h2 id="basic基本身份认证直接采用用户名密码"&gt;&lt;a href="https://en.wikipedia.org/wiki/Basic_access_authentication"&gt;Basic&lt;/a&gt;:基本身份认证，直接采用：用户名密码&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基本用法&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;should receive a status code of 200 with login&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/staging&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;the-username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;the-password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Base64加密&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;username:password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;base64&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- more --&gt;
&lt;h2 id="digest摘要式身份认证"&gt;&lt;a href="https://en.wikipedia.org/wiki/Digest_access_authentication"&gt;Digest&lt;/a&gt;:摘要式身份认证&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://some.server.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// or
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://some.server.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;auth&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;pass&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;sendImmediately&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// or
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://some.server.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bearerToken&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// or
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://some.server.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;auth&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;bearer&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bearerToken&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="oauth-authentication"&gt;&lt;a href="http://oauth.net/core/1.0/"&gt;OAuth Authentication&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;例子&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;OAuth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;openauth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;superagent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;superagent-openauth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;oauth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;consumerKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;consumerSecret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{...});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://api.twitter.com/1.1/statuses/update.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oauth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tokenSecret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;urlencoded&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello world&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;OAuth 1&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oauth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;oauth: OAuth instance token: string access token secret: string access token secret&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Gauge学习</title><link>https://shiyuanjie.cn/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/</link><pubDate>Fri, 19 Feb 2016 16:53:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/</guid><description>&lt;p&gt;&lt;picture&gt;&lt;source srcset="https://shiyuanjie.cn/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/github.Gauge_hu_f65b12bcecb337b2.webp" type="image/webp"&gt;&lt;img alt="Gauge脑图" loading="lazy" src="https://shiyuanjie.cn/posts/APITest/Gauge%E5%AD%A6%E4%B9%A0/github.Gauge.png"&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;之前梳理的&lt;a href="http://getgauge.io/"&gt;Gauge&lt;/a&gt;的资料，存放到这里，便于以后使用。&lt;/p&gt;</description></item><item><title>Tricky test scenario</title><link>https://shiyuanjie.cn/posts/QA/Tricky-test/</link><pubDate>Sat, 30 Jan 2016 18:47:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/QA/Tricky-test/</guid><description>&lt;h2 id="测试验证码收到客户投诉"&gt;测试&lt;code&gt;验证码&lt;/code&gt;，收到客户投诉&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scenario&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为普通用户,在用户注册时，可通过获取短信码使用手机号进行注册&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;用户注册时，需要测试手机号码与获取的短信码是否能正常收到且匹配。&lt;/li&gt;
&lt;li&gt;短信验证码由本项目生成,但由第三方来发送&lt;/li&gt;
&lt;li&gt;验证码发送是由第三方提供的，无法完全Mock&lt;/li&gt;
&lt;li&gt;数据库中会记录收到的短信验证码.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试策略&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试验证码能否匹配时,用了自己的手机号码来测试.&lt;/li&gt;
&lt;li&gt;后面再测试是否匹配时,发现没有手机号码可用,就 &lt;strong&gt;随机&lt;/strong&gt; 输入了手机号码进行测试,通过查询数据库来获取验证码&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;如上进行了一阵子测试,由于是国内某银行项目,后面就收到了客户投诉: &lt;strong&gt;没有进行任何的操作,便收到了短信验证码&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;分析&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;是否每次测试时,都需要通过第三方来发送短信验证码.&lt;/li&gt;
&lt;li&gt;仅Mock第三方收到请求,不需要每次都真实的发送短信功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;TIPS&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试中,一定要确保 &lt;strong&gt;普通用户&lt;/strong&gt; 不会收到短信验证码&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h2 id="同样返回内容在不同的浏览器中显示不同"&gt;同样&lt;code&gt;返回内容&lt;/code&gt;,在不同的浏览器中显示不同&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scenario&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为普通用户,在浏览页面时,可查看到Title显示的内容&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;需要从第三方系统中获取指定的内容,返回给浏览器,并显示到Title&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试策略&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;为确保兼容性,使用不同的浏览器进行查看&lt;/li&gt;
&lt;li&gt;涉及浏览器: &lt;strong&gt;Chrome,FireFox,IE&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;仅Chrome查看正常显示,FireFox/IE查看均会显示 &lt;strong&gt;部分&lt;/strong&gt; 乱码&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;分析&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;返回的内容中有 &lt;strong&gt;Unicode&lt;/strong&gt; 值为15的内容,这个返回值引起的显示乱码&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;TIPS&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在对第三方集成时,一定要先针对所有输入/输出内容均进行字符集处理.确保所用的字符集均一致&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="同样的样式在同一类浏览器中显示不同"&gt;同样的&lt;code&gt;样式&lt;/code&gt;，在同一类浏览器中显示不同&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scenario&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为普通用户，在浏览页面时，可查看到正确的页面显示与布局&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在页面布局测试时，需要查看页面的显示与布局的正确性&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试策略&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;使用浏览器查看页面的显示与布局&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在测试电脑中，发现页面的布局中的样式有问题（按钮被换行）&lt;/li&gt;
&lt;li&gt;在DEV的电脑中完全是好的（使用的同一发布版本进行测试）&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;分析&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;浏览器的版本是完全一致&lt;/li&gt;
&lt;li&gt;浏览器的 &lt;strong&gt;缩放比例&lt;/strong&gt; 不同，测试电脑的页面被设置为 &lt;strong&gt;缩放90%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;TIPS&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在测试页面的显示和样式时，一定要确保页面 &lt;strong&gt;浏览器版本、页面缩放&lt;/strong&gt; 完全一致&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="paas平台部署后时间出现偏差"&gt;PaaS平台部署后，时间出现&lt;code&gt;偏差&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scenario&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为普通用户，在注册新用户时，需要使用获取的验证码在5分钟内进行验证，否则验证码失效&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;页面前端点击 &lt;strong&gt;获取验证码&lt;/strong&gt; 后，需要在生成验证码5分钟内，进行注册&lt;/li&gt;
&lt;li&gt;生成的验证码会存储在 &lt;strong&gt;数据库&lt;/strong&gt; 中&lt;/li&gt;
&lt;li&gt;生成验证码是由程序代码生成，有效期的验证是由生成验证码时生成的&lt;strong&gt;Createtime&lt;/strong&gt;和&lt;strong&gt;当前时间&lt;/strong&gt;比较&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试策略&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在点击 &lt;strong&gt;获取验证码&lt;/strong&gt; 后，从数据库中查询生成的 &lt;strong&gt;验证码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;通过查询的验证码，进行用户注册&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在点击 &lt;strong&gt;获取验证码&lt;/strong&gt; 后，直接去数据库中查询&lt;strong&gt;验证码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;使用查询获取的&lt;strong&gt;验证码&lt;/strong&gt;，在进行用户注册时，提示验证码已过期(查询与注册的时间操作差，&lt;strong&gt;绝对&lt;/strong&gt;在5分钟内)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;分析&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;此功能在非&lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service"&gt;PaaS&lt;/a&gt;平台时完全正常的&lt;/li&gt;
&lt;li&gt;部署到Paas平台后，在&lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service"&gt;PaaS&lt;/a&gt;平台时，程序代码是部署到一台机器、数据库部署在&lt;strong&gt;另外&lt;/strong&gt;一台机器&lt;/li&gt;
&lt;li&gt;验证码的生成时间是由数据库脚本生成，获取的数据库的当前插入时间&lt;/li&gt;
&lt;li&gt;验证码有效期验证时，&lt;strong&gt;当前时间&lt;/strong&gt;为从&lt;strong&gt;程序代码&lt;/strong&gt;部署的机器获取&lt;strong&gt;当前系统时间&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;两台部署机器时区设置不一致(程序代码：&lt;strong&gt;Asia/Shanghai&lt;/strong&gt;，数据库:&lt;strong&gt;Etc/Zulu&lt;/strong&gt;)，两个时区相差8小时&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;TIPS&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;部署环境时，一定要先确保时间的设置是否会对功能有影响&lt;/li&gt;
&lt;li&gt;涉及到时间处理时，一定确保使用的是&lt;strong&gt;统一&lt;/strong&gt;的参考时间&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mock的模块在集成后mock相关的功能出错"&gt;Mock的模块在集成后，Mock相关的&lt;code&gt;功能出错&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scenario&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为普通用户，在查看个人账户时，可查看到账户余额&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;普通用户在查看个人账户时，需要通过系统去查询第三方系统数据&lt;/li&gt;
&lt;li&gt;在开发环境中第三方系统无法直接连接进行调试开发，因此提前做了Mock进行开发&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试策略&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试时，正常使用个人账户查询结果&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在到&lt;strong&gt;ST测试&lt;/strong&gt;环境时，无法正常查询账户余额。数据解析报错&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;分析&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;使用Mock返回的数据时，在ST环境可正常查询&lt;/li&gt;
&lt;li&gt;但使用第三方&lt;strong&gt;真实&lt;/strong&gt;返回的数据查询时，在ST便会报错&lt;/li&gt;
&lt;li&gt;对&lt;strong&gt;真实&lt;/strong&gt;数据进行分析，发现&lt;strong&gt;数据结构&lt;/strong&gt;已与之前Mock的不同&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;TIPS&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;针对Mock系统，一定要有对应的测试，确保接口的正确性及数据正确性&lt;/li&gt;
&lt;li&gt;针对需要Mock的功能，一定要定期与集成方沟通，确保开发功能、接口变同的同步&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="特定文件内容无法上传到生产环境其它环境均正常"&gt;特定文件内容无法上传到&lt;code&gt;生产环境&lt;/code&gt;，其它环境均正常&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scenario&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为注册用户，在个人信息中，可上传文档&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;功能&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;注册用户，可使用&lt;strong&gt;上传文档&lt;/strong&gt;功能，上传个人文档&lt;/li&gt;
&lt;li&gt;针对上传的文件内容及类型均无限制（由于系统是&lt;strong&gt;特定&lt;/strong&gt;人群使用，所以对文件&lt;strong&gt;类型&lt;/strong&gt;均没有限制），&lt;strong&gt;文件大小&lt;/strong&gt;此处不考虑&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;测试策略&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;针对上传文件类型进行测试：txt/exe/pdf/doc等&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;上传txt/html时，若文件以**&amp;lt;**开头时，上传功能在其它环境均可正常使用，但在生产环境则上传会失败&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;分析&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;生产环配制有网关，会对文件内容进行过滤&lt;/li&gt;
&lt;li&gt;若文件html/js/txt文件中以**&amp;lt;&lt;strong&gt;开头时，则会被判断为&lt;/strong&gt;注入**文件&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;TIPS&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;作为测试人员，也要对&lt;strong&gt;安全测试&lt;/strong&gt;常出现的问题进行考虑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考资料"&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PAAS：&lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service"&gt;https://en.wikipedia.org/wiki/Platform_as_a_service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;时区差：&lt;a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"&gt;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Asia/Shanghai:&lt;a href="https://en.wikipedia.org/wiki/Asia/Shanghai"&gt;https://en.wikipedia.org/wiki/Asia/Shanghai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Etc/Zulu:&lt;a href="http://www.prokerala.com/travel/timezones/Etc/Zulu"&gt;http://www.prokerala.com/travel/timezones/Etc/Zulu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mock：&lt;a href="https://en.wikipedia.org/wiki/MockServer"&gt;https://en.wikipedia.org/wiki/MockServer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ST测试：&lt;a href="https://en.wikipedia.org/wiki/System_testing"&gt;https://en.wikipedia.org/wiki/System_testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安全测试：&lt;a href="http://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html"&gt;http://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SuperTest-API测试</title><link>https://shiyuanjie.cn/posts/SuperTest/SuperTest/</link><pubDate>Sun, 17 Jan 2016 19:51:00 +0800</pubDate><guid>https://shiyuanjie.cn/posts/SuperTest/SuperTest/</guid><description>&lt;h2 id="什么是supertest"&gt;什么是SuperTest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The motivation with this module is to provide a high-level abstraction for testing HTTP, while still allowing you to drop down to the lower-level API provided by super-agent.&lt;/li&gt;
&lt;li&gt;简单说明：用来测试HTTP请求，提供简单的super-agent来实现API请求&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装supertest"&gt;安装SuperTest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;npm安装&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;官网下载对应的操作系统版本-&lt;a href="https://nodejs.org/en/download/"&gt;NPM&lt;/a&gt;，下载完成后，直接进行安装即可&lt;/li&gt;
&lt;li&gt;cnpm,若翻墙网络比较慢或访问不了的话，可以尝试使用cnpm(国内的镜像)。&lt;a href="https://github.com/cnpm/cnpm"&gt;CNPM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;SuperTest安装&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install supertest --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;grunt安装&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install -g grunt-cli
&lt;/code&gt;&lt;/pre&gt;&lt;!-- more --&gt;
&lt;h2 id="使用grunt来管理和运行supertest"&gt;使用Grunt来管理和运行SuperTest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git Clone &lt;a href="https://github.com/aimer1124/SuperTestDemo"&gt;SuperTestDemo&lt;/a&gt;。此项目针对访问的URL的返回状态进行验证。&lt;/p&gt;</description></item></channel></rss>