Jekyll2021-01-14T23:37:09+08:00https://zxning.github.io/feed.xmlzxningzxning 的个人博客zxningPostman接口测试六 | 测试数据参数化(文件)2021-01-14T00:00:00+08:002021-01-14T00:00:00+08:00https://zxning.github.io/2021/01/14/Postman6<h3 id="需求">需求</h3>
<p>被测app有个功能是:谁喜欢了我,使用postman请求like接口可以模拟有人喜欢了我。</p>
<p>但是通常需要多个人喜欢我。每次增加一个人喜欢我的时候,就要使用新的token。每次替换token是个繁重的体力活。如果只是一两个就还好,如果一次需要8,9,10个,就相当麻烦了。</p>
<p>还好postman的参数化可以解决这个问题</p>
<h3 id="解决方案">解决方案</h3>
<ol>
<li>在value处填写调用的参数,例如:</li>
</ol>
<p><img src="/images/2021-01-14-1.png" alt="" /></p>
<ol>
<li>准备一个TXT或者CSV文件,第一行填写调用的参数名,下面写参数值,例如:</li>
</ol>
<p><img src="/images/2021-01-14-2.png" alt="" /></p>
<ol>
<li>save as到一个collection中,点击批量运行,Run</li>
</ol>
<p><img src="/images/2021-01-14-3.png" alt="" /></p>
<ol>
<li>“Select File” 处选择TXT文件,会报错 “Something went wrong,Please try again”, 手动修改 Data File Type 的类型为text/csv,这样就好了,不用再关注那个报错了</li>
</ol>
<p>如果数据格式是csv格式的,上传后就不会报错</p>
<p>选择文件后,“Iterations”处会根据参数的个数变化</p>
<p><img src="/images/2021-01-14-4.png" alt="" /></p>
<ol>
<li>点击Run,直接运行。可以在结果中查看传参是否正确</li>
</ol>zxning需求Postman接口测试五 | pre-request-script2020-11-11T00:00:00+08:002020-11-11T00:00:00+08:00https://zxning.github.io/2020/11/11/Postman5<p>Postman 提供 pre-request-script 功能用于修改 request 之前的请求参数。打开请求,在 Request 区域点击tab ”pre-request-script“,当然 postman 也提供一些现成的示例片段,见右侧 SNIPPETS 区域,下面先介绍示例的含义</p>
<h2 id="示例介绍">示例介绍</h2>
<p>1、Get an environment variable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.environment.get("variable_key");
//获得环境变量
</code></pre></div></div>
<p>2、Get a global variable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.globals.get("variable_key");
//获得全局环境变量
</code></pre></div></div>
<p>3、Get a variable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.variables.get("variable_key");
//获得一个变量
</code></pre></div></div>
<p>4、Set an environment variable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.environment.set("variable_key", "variable_value");
//设置环境变量
</code></pre></div></div>
<p>5、Clear an environment variable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.environment.unset("variable_key");
//清除环境变量
</code></pre></div></div>
<p>6、Clear a global variable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.globals.unset("variable_key");
//清除全局变量
</code></pre></div></div>
<p>7、Send a request</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.sendRequest("https://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
//发送一个请求
</code></pre></div></div>
<h2 id="使用方法">使用方法</h2>
<p>下面是 “设置环境变量”,“清除环境变量”,以及“发送请求”等脚本的使用方法</p>
<h3 id="前提">前提</h3>
<p>Add一个environment:test,为空,不设置里面的具体值。 并选择该环境变量</p>
<p><img src="/images/2020-11-11-1.png" alt="" /></p>
<p><img src="/images/2020-11-11-2.png" alt="" /></p>
<h3 id="设置清除环境变量">设置&清除环境变量</h3>
<p>1、打开一个请求的 Request > pre-request-script 页签,填写如下代码设置did和host为环境变量</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.environment.set("did", "95a77d236eab2cf3ea17ddc19450a2ca");
console.log(pm.environment.get("did"))
pm.environment.set("host", "http://api.anychat.boochat.cn");
console.log(pm.environment.get("host"))
// 设置环境变量did=95a77d236eab2cf3ea17ddc19450a2ca, host=http://api.anychat.boochat.cn 并输出日志
</code></pre></div></div>
<p>2、在对应的URL或者header处调用设置的环境变量{{host}},{{did}}</p>
<p>3、点击send,点击右上角的眼睛标志,可以看到环境变量已经设置,且依赖最新设置的环境变量,在Response区域返回了结果</p>
<p><img src="/images/2020-11-11-3.png" alt="" /></p>
<p>备注:以上的token是由于在tests页签下设置了参数关联</p>
<p><img src="/images/2020-11-11-4.png" alt="" /></p>
<p>4、增加代码<code class="language-plaintext highlighter-rouge">pm.environment.unset("did");</code>再点击send,在查看右上角发现,did使用完又被清除了</p>
<p><img src="/images/2020-11-11-5.png" alt="" /></p>
<h3 id="发送请求">发送请求</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.sendRequest("https://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
</code></pre></div></div>
<p>使用场景:某一域名下的请求统一去服务器加密等,目前的项目没有这样的需求,不好举例了。等后续有例子了再补充</p>
<p>当前项目上有返回结果被加密了,看起来很不方便,返回结果如下所示</p>
<p><img src="/images/2020-11-11-6.png" alt="" /></p>
<p>做接口测试的时候,为了看加密的内容,每次都要将加密的值拷贝到一个内部接口里面进行解密。</p>
<p>现在结合send功能,可以做简单的修改。</p>
<p>由于想要干预的是返回结果,因此需要在Tests页签上使用该功能(该处主要说明send的功能,如果想要干预请求,则将send脚本放在pre-request-script)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var jsonData = pm.response.json()
const echoPostRequest = {
url: 'http://192.168.1.10:13001/v1/aes',
method: 'POST',
header:'Content-Type:application/json',
body: {
mode: 'raw',
raw: JSON.stringify({"t":"decode","data": jsonData.data})
}
};
pm.sendRequest(echoPostRequest, function (err, res) {
console.log(err ? err : res.json());
});
</code></pre></div></div>
<p>运行后,可以看到解密的数据展示在了console中(要是能直接展示在Response区域就更好了)</p>
<p><img src="/images/2020-11-11-7.png" alt="" /></p>
<h3 id="批量pre-request-script">批量pre-request-script</h3>
<p>同批量执行Tests的方法一样,见上文</p>zxningPostman 提供 pre-request-script 功能用于修改 request 之前的请求参数。打开请求,在 Request 区域点击tab ”pre-request-script“,当然 postman 也提供一些现成的示例片段,见右侧 SNIPPETS 区域,下面先介绍示例的含义Postman接口测试四 | Tests断言2020-11-10T00:00:00+08:002020-11-10T00:00:00+08:00https://zxning.github.io/2020/11/10/Postman4<h3 id="断言简介">断言简介</h3>
<p>Postman提供了一些断言方法,对接口做断言测试。Request 区域点击tab“Tests”, 编写断言脚本。当然,postman也提供了一些现成的断言的示例,查看右边的SNIPPETS 区域,如下图所示:</p>
<p><img src="/images/2020-11-10-1.png" alt="" /></p>
<p>点击后,套用模板填写,点击send发送请求。在Response 区域点击tab “Test Results” 查看断言结果,断言成功则pass,断言失败则fail。如下所示:</p>
<p><img src="/images/2020-11-10-2.png" alt="" /></p>
<h3 id="前提">前提</h3>
<p>接口返回结果如下所示(网上很多例子都没有返回结果的结构图,看起来很不方便)</p>
<p><img src="/images/2020-11-10-3.png" alt="" /></p>
<h3 id="断言脚本">断言脚本</h3>
<p>1.Status code: Code is 200</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// 断言返回状态码,预期中写的是200,因此,返回200就pass,返回非200fail
//“Status code is 200”处的内容是直接输出的,可以任意写,示例如下:
</code></pre></div></div>
<p><img src="/images/2020-11-10-4.png" alt="" /></p>
<p>写了两条关于返回值的断言,第一条pass,第二条fail</p>
<p>2.Response body: JSON value check</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("检查返回的ID是203", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.data.user_info.user_id).to.eql(203);
});
//断言返回结果中的用户id是203,示例如下:
</code></pre></div></div>
<p><img src="/images/2020-11-10-5.png" alt="" /></p>
<p>3.Response body: is equal to a string</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
//断言返回结果和预期的结果一致,比对的是返回的所有body,因此"response_body_string"处需要将接口返回的raw结果```{"code":200,"data":{}} ```[转义](https://www.json.cn/json/jsonzip.html)后,全部拷贝到“”处,
</code></pre></div></div>
<p>例如:</p>
<p><img src="/images/2020-11-10-6.png" alt="" /></p>
<p>4.Response body: contain string</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
//断言返回中包含某个value,例如返回内容如下,断言结果中包含“HelloHello”
</code></pre></div></div>
<p><img src="/images/2020-11-10-7.png" alt="" /></p>
<p><img src="/images/2020-11-10-8.png" alt="" /></p>
<p>5.Response headers: Content-Type header check</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
//断言返回的结果中header中包含指定的字段,如包含Content-Type,包含Content-Encoding,或者包含其他的字段
</code></pre></div></div>
<p>例如:</p>
<p><img src="/images/2020-11-10-9.png" alt="" /></p>
<p>6.Response time is less than 200ms</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
//断言接口返回时间,这个很简单,不用说
</code></pre></div></div>
<p>7.Status code: Successful POST request</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
//断言post请求状态码是201和202的其中一个,则pass,否则fail。使用场景暂不清楚
</code></pre></div></div>
<p><img src="/images/2020-11-10-10.png" alt="" /></p>
<p>试了一下get接口,也能用[手动捂脸]</p>
<p>8.Status code: Code name has string</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pm.test("Status code name has string", function () {
pm.response.to.have.status("OK");
});
//断言返回状态码的名字
</code></pre></div></div>
<p>返回状态和对应名称如下所示了一部分</p>
<table>
<thead>
<tr>
<th>状态码</th>
<th style="text-align: left">名称</th>
</tr>
</thead>
<tbody>
<tr>
<td>100</td>
<td style="text-align: left">Continue</td>
</tr>
<tr>
<td>500</td>
<td style="text-align: left">InternalServerError</td>
</tr>
<tr>
<td>501</td>
<td style="text-align: left">NotImplemented</td>
</tr>
<tr>
<td>502</td>
<td style="text-align: left">BadGateway</td>
</tr>
<tr>
<td>503</td>
<td style="text-align: left">ServiceUnavailable</td>
</tr>
</tbody>
</table>
<p><img src="/images/2020-11-10-11.png" alt="" /></p>
<p>9.Response body: Convert XML body to a JSON Object</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var jsonObject = xml2Json(responseBody);
//没有找到合适的例子,略过,后续补充
</code></pre></div></div>
<p>10.Use Tiny Validator for JSON data</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
pm.test('Schema is valid', function () {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;
});
//断言返回值中JSON的结构,参数,参数类型,必需字段
</code></pre></div></div>
<p>以获取注册天数的接口举个例子,以下是返回数据:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"code": 200,
"data": {
"room_count": 0,
"reg_days": 89
}
}
</code></pre></div></div>
<p>脚本如下所示:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var schema = {
properties: {
code: {type:"number"},
data: {
properties:{
room_count:{type:"number"},
reg_days:{type:"number"},
},
required:["room_count","reg_days"]
},
},
required:["code"]
};
var data1 = JSON.parse(responseBody);
pm.test('Schema is valid', function () {
pm.expect(tv4.validate(data1, schema)).to.be.true;
});
//1,断言必需字段是code,data,room_count,reg_days。2,断言数据类型。Code,room_count,reg_days等字段是number型,data是object型。3,required是验证必需字段。
</code></pre></div></div>
<p>点击send后,结果如下:</p>
<p><img src="/images/2020-11-10-16.png" alt="" /></p>
<p>当验证必需字段的时候,如果增加一个字段name,则验证结果是fail</p>
<p><img src="/images/2020-11-10-17.png" alt="" /></p>
<h3 id="批量断言">批量断言</h3>
<p>点击collection对应的菜单栏 > Edit >Test ,写上断言的内容,update</p>
<p><img src="/images/2020-11-10-12.png" alt="" /></p>
<p><img src="/images/2020-11-10-13.png" alt="" /></p>
<p>运行整个collection</p>
<p><img src="/images/2020-11-10-14.png" alt="" /></p>
<p>获得结果。如果接口原来就有test的话,会断言两条,如下所示</p>
<p><img src="/images/2020-11-10-15.png" alt="" /></p>
<p>备注:postman有个bug,害我今天试了好多遍批量断言
New > collection >Tests,输入对应的断言内容后,再增加接口,再批量跑,竟然pass 0 fail 0。因此建议大家还是用上面的方法,直接Edit Collection,添加断言内容</p>zxning断言简介Postman接口测试三 | 参数变量2020-10-25T00:00:00+08:002020-10-25T00:00:00+08:00https://zxning.github.io/2020/10/25/Postman3<p>做接口测试的时候,很多接口都要依赖登录接口返回的token值,每登录一次,token值都会刷新,如何自动更新下一个接口的token值?postman来搞定</p>
<p>下面以duolive项目,获取礼物列表的接口为例说明,需求描述:登录841的账号后,获取TA的礼物列表。下面是登录接口返回值</p>
<p><img src="/images/2020-10-25-1.png" alt="" /></p>
<h3 id="设置token环境变量">设置token环境变量</h3>
<p>在环境变量中增加“access_token”,值为空</p>
<p>1.点击quick environment look > Edit, 添加access_token。添加的值叫token还是叫access_token,要根据自己项目登录接口返回的token来决定。添加之后,点击“update”按钮</p>
<p><img src="/images/2020-10-25-2.png" alt="" /></p>
<h3 id="获取token">获取token</h3>
<p>在登录接口request部分 > Tests中添加获取token的代码并将token设置为环境变量</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var data = JSON.parse(responseBody);
if (data.data.access_token) {
tests["Body has token"] = true;
postman.setEnvironmentVariable("access_token", data.data.access_token);
}
else {
tests["Body has token"] = false;
}
</code></pre></div></div>
<p>注:需要注意access_token的层级关系(查看本文第一张图),第一个data指的是整体的返回数据,第二个data是返回值中的data,第三个是token的key,本例子中是“access_token”</p>
<p><img src="/images/2020-10-25-3.png" alt="" /></p>
<p>点击send运行,运行后检查环境变量中access_token中已经被赋了上一步的返回值</p>
<p><img src="/images/2020-10-25-4.png" alt="" /></p>
<h3 id="其他接口调用">其他接口调用</h3>
<p>获取礼物接口调用上一步的token值</p>
<ol>
<li>选择环境变量</li>
<li>调用环境变量</li>
<li>运行登录接口</li>
<li>运行获取礼物接口</li>
</ol>
<p><img src="/images/2020-10-25-5.png" alt="" /></p>
<p>注意事项:</p>
<ol>
<li>第二个接口要依赖第一个接口,因此每次要获取第二个接口的最新结果时要先运行第一个接口,再运行第二个接口</li>
<li>当第一个接口的代码变更时,即使运行了send,一定要记得先save,再运行第二个接口,否则第一个接口的改动会不生效</li>
</ol>zxning做接口测试的时候,很多接口都要依赖登录接口返回的token值,每登录一次,token值都会刷新,如何自动更新下一个接口的token值?postman来搞定Postman接口测试二| 环境变量2020-10-24T00:00:00+08:002020-10-24T00:00:00+08:00https://zxning.github.io/2020/10/24/Postman2<h2 id="三种环境变量">三种环境变量</h2>
<p>postman中有三种环境变量:分别是Collection变量,Global Environment, Environment</p>
<p>1.Collection变量,对该集合下的接口生效。File > New > Collection > Variables。</p>
<p><img src="/images/2020-10-24-1.png" alt="" /></p>
<p>2.Global Enviroment,全局环境变量,对所有的接口都生效。Management Environments > Global</p>
<p><img src="/images/2020-10-24-2.png" alt="" /></p>
<p>3.Enviroment, 环境变量,添加后选择了就会生效。Management Environments > Add</p>
<p><img src="/images/2020-10-24-3.png" alt="" /></p>
<h2 id="环境变量enviroment">环境变量Enviroment</h2>
<p>以下主要说明Enviroment的用法,其他的环境变量设置方法相同,只是作用域不同(注: 同一个变量既设置了环境变量又设置了全局变量,选择环境变量后,全局变量会时效)</p>
<p>查看postman右上角,即为环境变量的设置区域,下面分别说明:</p>
<p><img src="/images/2020-10-24-4.png" alt="" /></p>
<p>1.下拉框:如已经创建了环境变量,点击下拉框可以切换环境变量或者选择No environment</p>
<p>2.Environment quick look(眼睛按钮):查看已经选择了的环境变量中都设置了哪些参数</p>
<p><img src="/images/2020-10-24-5.png" alt="" /></p>
<p>3.Manage enviroments(设置):环境变量和全局环境变量的设置入口</p>
<p><img src="/images/2020-10-24-6.png" alt="" /></p>
<h3 id="设置环境变量">设置环境变量</h3>
<ol>
<li>
<p>点击Manage enviroments按钮,如上所示,里面有已经设置的环境变量,点击Add, 就可以新增加环境变量</p>
</li>
<li>
<p>填写名称:duolive测试环境</p>
<p>添加变量和值,如,host和app,然后点击”Add“ 按钮(如果是编辑已有的环境变量,则点击”update“按钮)</p>
</li>
</ol>
<p><img src="/images/2020-10-24-8.png" alt="" /></p>
<h3 id="环境变量的使用">环境变量的使用</h3>
<p>添加环境变量成功后,在下拉框中选择你想使用的环境变量</p>
<p><img src="/images/2020-10-24-9.png" alt="" /></p>
<p>点击 ”quick look“ 可以查看当前选择的环境变量下都设置了哪些变量</p>
<p>要使用环境变量,先选择要使用的环境变量,如,”duolive测试环境”,通过名字引用</p>
<blockquote>
<p><strong>{{host}}</strong></p>
</blockquote>
<p>已经生效的环境变量是会变成橙色的,引用失败是红色的(失败是因为环境变量里面没有定义)</p>
<p><img src="/images/2020-10-24-10.png" alt="" /></p>zxning三种环境变量Postman接口测试一| 基础功能2020-10-16T00:00:00+08:002020-10-16T00:00:00+08:00https://zxning.github.io/2020/10/16/Postman1<p>Postman是接口测试的利器,无论开发还是测试,使用postman都能事半功倍</p>
<p>官网下载,安装就不用说了,直接进入主题</p>
<h3 id="创建账号">创建账号</h3>
<p>打开之后点击右上角的sign in, 有账号的直接登录。没有账号的,在登录界面右上角点击Create Account,然后登录</p>
<p><img src="/images/2020-10-16-1.png" alt="" /></p>
<h3 id="界面介绍">界面介绍</h3>
<p>基本的界面介绍,如下图所示,</p>
<p><img src="/images/2020-10-16-2.png" alt="" /></p>
<h3 id="发送get请求">发送get请求</h3>
<p>创建新请求的入口很多,例如:在Launchpad点击”create a request “ 或者直接点击tab上的+号</p>
<p><img src="/images/2020-10-16-3.png" alt="" /></p>
<p>点击后,出现如下图所示界面</p>
<p><img src="/images/2020-10-16-4.png" alt="" /></p>
<ol>
<li>选择method,本示例接口中,选择的是get</li>
<li>填写URL+path</li>
<li>填写header</li>
</ol>
<blockquote>
<p><strong>Tips: 如图上所示的”Bulk Edit”,点击后,可以直接从Charles上复制所有的header的信息进行粘贴,粘贴好之后点击Key-Value Edit再切换成表格样式</strong></p>
</blockquote>
<ol>
<li>如果有参数的话,点击params,填写参数,本示例中没有</li>
<li>点击send,在response处即可查看返回结果</li>
<li>如果这个结果以后需要长期跟进的话,可以点击save,保存到新建或者已有的collection中</li>
</ol>
<p>备注:上图没有填写token,填写token的两种方法:</p>
<ol>
<li>直接填写在header处,key写Authorization,value写Bearer XXXXXX</li>
<li>填写在Authorization处,选择Bearer Token ,Token处直接填写XXXXX</li>
</ol>
<p><img src="/images/2020-10-16-5.png" alt="" />
<img src="/images/2020-10-16-6.png" alt="" /></p>
<h3 id="发送post请求">发送post请求</h3>
<p><img src="/images/2020-10-16-7.png" alt="" /></p>
<ol>
<li>与发送get请求不同的地方是,此处选择post方法</li>
<li>填写URL+path,同上</li>
<li>填写token,同上</li>
<li>填写header,同上</li>
<li>与发送get请求不同的是,post请求的都要上传body,body的格式和内容根据文档或者抓包结果来确定,本示例上传的内容是json格式的,因此选择raw, 后面选择JSON</li>
<li>发送,发送后如果需要可以保存到collection</li>
</ol>zxningPostman是接口测试的利器,无论开发还是测试,使用postman都能事半功倍苹果APP订阅点总结2020-09-07T00:00:00+08:002020-09-07T00:00:00+08:00https://zxning.github.io/2020/09/07/%20Apple-subscription<h3 id="apple-手机订阅测试点">Apple 手机订阅测试点</h3>
<h4 id="需求">需求:</h4>
<p>订阅套餐A:monthly银卡会员,送1200金币,2个喜欢
订阅套餐B: monthly金卡会员,送6500金币,5个喜欢
订阅套餐C:monthly铂金卡会员,送14000金币,15个喜欢</p>
<h4 id="测试点">测试点:</h4>
<ol>
<li>单独订阅其中一个套餐,价格,赠送的金币等都正确</li>
<li>单独订阅其中一个套餐后,续订后,给的内容都正确</li>
<li>订阅后升级/降级套餐,扣钱就赠送对应的金币或者喜欢(没扣钱就不会赠送),续订后按照升级/降级后的套餐赠送</li>
<li>同一个设备,同一个苹果账号,订阅后,删除账号再注册,点击restore,会将会员状态同步过来(金币状态不能同步)</li>
<li>同一个设备,同一个苹果账号,订阅后,删除账号再注册,相同的套餐不能再订阅,换套餐要能订阅成功</li>
<li>AB两个设备,同一个苹果账号,A设备订阅后,B设备再次订阅都会失败,restore也会失败(只能restore已注销用户的会员状态)</li>
</ol>
<h4 id="备注苹果app沙河账号的测试时间">备注:苹果APP沙河账号的测试时间</h4>
<p><img src="/images/2020-09-07-1.png" alt="" /></p>
<p><a href="https://help.apple.com/app-store-connect/#/dev7e89e149d">参考链接:https://help.apple.com/app-store-connect/#/dev7e89e149d</a></p>zxningApple 手机订阅测试点Pytest | No module named ‘xxx’2020-07-29T00:00:00+08:002020-07-29T00:00:00+08:00https://zxning.github.io/2020/07/29/%20No-module-named-xxx<h3 id="1-问题描述">1. 问题描述</h3>
<p>在pycharm中运行py文件是可以的,但是在terminal中运行就报出 No module named ‘xxx’ ,如下图所示:</p>
<p><img src="/images/2020-07-29-1.png" alt="" /></p>
<p>目录结构如下所示:</p>
<p><img src="/images/2020-07-29-2.png" alt="" /></p>
<h3 id="2-解决方案">2. 解决方案</h3>
<p>在运行的py文件中,本处指的是:test_in_login.py,增加项目的绝对路径,如下所示:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import os
import sys
sys.path.append("/Users/zz/Documents/api_pytest")
</code></pre></div></div>
<p>再次运行,结果如下:</p>
<p><img src="/images/2020-07-29-3.png" alt="" /></p>zxning1. 问题描述Appium | Locator Strategy ‘css selector’ is not supported for this session2020-07-21T00:00:00+08:002020-07-21T00:00:00+08:00https://zxning.github.io/2020/07/21/appium-css-css%20selector<p>appium问题集合</p>
<h3 id="1-问题描述">1. 问题描述</h3>
<p>使用appium找元素用的 driver.find_element_by_id ,结果报错:selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy ‘css selector’ is not supported for this session</p>
<p>appium 3.17 去掉了 find_element_by_name ,想着怎么样也不能去掉by_id啊,查了查去,感觉最接近的就是版本不兼容</p>
<p>使用 <code class="language-plaintext highlighter-rouge">python3 -m pip show selenium</code> 查看本机安装的selenium版本是3.14.1</p>
<h3 id="2-解决方案">2. 解决方案</h3>
<p>降级selenium</p>
<p>MAC,直接从安装目录下删除3.14.1版本的selenium,重新安装selenium 2.53.6 <code class="language-plaintext highlighter-rouge">pip3 install selenium==2.53.6</code></p>zxningappium问题集合手机连接Charles ,有需要访问外网的接口该怎么办2020-06-04T00:00:00+08:002020-06-04T00:00:00+08:00https://zxning.github.io/2020/06/04/Charles<h3 id="一问题描述">一、问题描述</h3>
<p>公司的业务都在国外,测试的过程中经常需要抓接口定位问题,而有的接口需要翻墙,例如:谷歌登录。用手机端翻墙的话,Charles上就完全看不到接口信息了</p>
<h3 id="二问题解决">二、问题解决</h3>
<ol>
<li>手机连接Charles</li>
<li>电脑翻墙</li>
<li>
<p>查看自己电脑端shadowsocket的HTTP 代理设置监听地址,如图所示,我的是127.0.0.1,端口1087</p>
<p><img src="/images/2020-06-04-2.png" alt="" /></p>
</li>
<li>
<p>设置Charles,proxy > External Proxy Settings, 勾选Use external proxy servers,勾选web proxy 和 Secure Web Proxy, 填写上面的端口号。如图</p>
<p><img src="/images/2020-06-04-1.png" alt="" /></p>
</li>
<li>在手机端访问一个需要翻墙的接口,或者直接在手机端浏览器里面使用谷歌浏览器,大功告成</li>
</ol>
<h3 id="三最后">三、最后</h3>
<p>感谢小胖同学</p>zxning一、问题描述