前提

时间戳转换 : https://tool.lu/timestamp/
image.png

1. 获取token

接口文档:
https://work.weixin.qq.com/api/doc/90000/90135/91039

参数 必须 说明
corpid 企业ID,获取方式参考:术语说明-corpid ww88fc20d87e4cdfa1
corpsecret 应用的凭证密钥,获取方式参考:术语说明-secret gPo9q2e_9qmsDxcGnrPfC2EYRhfpw0yg6UGQdQTeb3k

2.练习 打卡签到API

https://work.weixin.qq.com/api/doc/90000/90135/90261

image.png


  1. 要使用到上下游传参

  2. 断言


如果需要用到用户id

上下游传参

image.png

企业微信.postman_environment.json
企业微信-OA-打卡.postman_collection.json

  1. pm.environment.set("groupid",jsonData["info"][0]["group"]["groupid"])
  2. pm.environment.set("day",jsonData["info"][0]["group"]["checkindate"][0]["workdays"][0])

如果每个接口的返回结果都有共同的特征,比如状态码都为200
返回结果中的errcode值都为0, 添加断言可以直接在 collection上添加。

image.png

  1. pm.test("Status code is 200", function () {
  2. pm.response.to.have.status(200);
  3. });
  4. pm.test("Your test name", function () {
  5. var jsonData = pm.response.json();
  6. pm.expect(jsonData["errcode"]).to.eql(0);
  7. });

运行
image.png
点击【Run】运行
image.png

可以看到整个collection下所有的运行结果。


图片测试

image.png
如果需要使用base64 格式的图片,
https://tool.chinaz.com/tools/imgtobase
将图片转码之后放进图片进行操作即可。


csv 文件配置

在测试 发布话题的时候
image.png
除了要测试正常的业务场景之外,还要测试异常场景。
异常场景

  1. token值为错误或者 空
  2. title 值小于10个字符或者为空
  3. tab 值 不再这四个值之中或者为空
  4. content 内置为空

这些场景在测试的时候都要考虑进去。
如果每一个异常场景都建立一个request , 这样的话会创建很多请求。
这些接口 请求方法,请求路径都一样,唯一就是请求的参数值不一样。
数据驱动的方式来进行测试。即csv 文件数据驱动。


  1. 创建测试数据,将测试数据存放到csv 文件中。 | token | title | tab | content | | —- | —- | —- | —- | | | helloworld | ask | 1234567 | | 875a8cd6-2c27-478e-9eea-607e1cf58641 | 123456789 | ask | 123456 | | 875a8cd6-2c27-478e-9eea-607e1cf58641 | 1 | ask | 122345 | | 875a8cd6-2c27-478e-9eea-607e1cf58642 | helloworld | ask | 1234567 | | 875a8cd6-2c27-478e-9eea-607e1cf58641 | helloworld | top | 1234567 | | 875a8cd6-2c27-478e-9eea-607e1cf58641 | helloworld | | 1234567 | | 875a8cd6-2c27-478e-9eea-607e1cf58641 | helloworld | ask | |

image.png
testdata.csv

  1. 创建Http请求,在请求中将对应值的使用变量的形式来进行。

    1. {
    2. "accesstoken":"{{token}}",
    3. "title":"{{title}}",
    4. "tab":"{{tab}}",
    5. "content":"{{content}}"
    6. }

    image.png
    变量名就是上面第一步创建的csv文件中的变量名,保持一致。
    保存脚本。

  2. 运行脚本。

运行的时候选择对应
的csv文件。
image.png
运行
image.png


wps 设置csv文件

写完文件之后, 另存为 — [csv 格式]
image.png
保存完成之后,关闭wps ,使用记事本 打开 这个csv文件
image.png
在记事本中 【文件】—【另存为】
image.pngimage.png
在编码中选择【utf8】 格式。


csv文件驱动中动态添加断言

上面的csv文件中 每一条数据测试的业务场景都不一样。比如当token值错误的时候,

  1. http返回状态码为 401
  2. 返回结果中的 error_msg 值为 “错误的accessToken”

当标题字数小于10个字的时候,检查点

  1. http返回的状态码 400
  2. 返回结果中的 error_msg 值为“标题字数太多或太少”

当其它场景的,这些检查点都不一样。
所以这种情况,断言就不能写死。下面给大家演示如何动态添加断言。

csv数据文件中添加断言结果

在csv文件中每一行的数据都代表一个场景,可以将这个场景下的断言结果放到文件后面
image.png

token title tab content errormsg
helloworld ask 1234567 错误的accessToken
875a8cd6-2c27-478e-9eea-607e1cf58641 1.23E+08 ask 123456 标题字数太多或太少
875a8cd6-2c27-478e-9eea-607e1cf58641 1 ask 122345 标题字数太多或太少
875a8cd6-2c27-478e-9eea-607e1cf58641 ask 122345 标题不能为空
875a8cd6-2c27-478e-9eea-607e1cf58642 helloworld ask 1234567 错误的accessToken
875a8cd6-2c27-478e-9eea-607e1cf58641 helloworld top 1234567 必须选择一个版块
875a8cd6-2c27-478e-9eea-607e1cf58641 helloworld 1234567 必须选择一个版块
875a8cd6-2c27-478e-9eea-607e1cf58641 helloworld ask 内容不能为空

testdata.csv

  1. 添加断言
    1. pm.test("errormsg字段添加断言", function () {
    2. var jsonData = pm.response.json();
    3. // 动态调用csv文件中定义的errormsg字段
    4. pm.expect(jsonData["error_msg"]).to.eql(pm.variables.get("errormsg"));
    5. });
    image.png
    保存脚本,并运行。
    运行完成之后,可以直接看运行报告,比如我们的系统中存在一个bug,就是当标题的字数为9个字的时候,需求是不能发帖成功,但是发帖成功。
    image.png

作业

  1. http和https的区别
  2. 列出常见的http 状态码 10 个, 并简述每个状态码的含义。
  3. 将发帖使用csv数据驱动的方式再添加一个 关于动态 断言返回的状态码断言。

csv 数据驱动.postman_collection.json
testdata.csv
添加断言
image.png

  1. pm.test("errormsg字段添加断言", function () {
  2. var jsonData = pm.response.json();
  3. // 动态调用csv文件中定义的errormsg字段
  4. pm.expect(jsonData["error_msg"]).to.eql(pm.variables.get("errormsg"));
  5. });
  6. pm.test("状态码进行判断"+pm.variables.get("status"), function () {
  7. pm.response.to.have.status(pm.variables.get("status"));
  8. });

testdata.csv
image.png

  1. 1xx消息
  2. 这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。[3] 这些状态码代表的响应都是信息性的,标示客户应该等待服务器采取进一步行动。
  3. 100 Continue
  4. 服务器已经接收到请求头,并且客户端应继续发送请求主体(在需要发送身体的请求的情况下:例如,POST请求),或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。要使服务器检查请求的头部,客户端必须在其初始请求中发送Expect: 100-continue作为头部,并在发送正文之前接收100 Continue状态代码。响应代码417期望失败表示请求不应继续。[2]
  5. 101 Switching Protocols
  6. 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade消息头中定义的那些协议。[4]
  7. 只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP版本(如HTTP/2)比旧版本更有优势,或者切换到一个实时且同步的协议(如WebSocket)以传送利用此类特性的资源。
  8. 2xx成功
  9. 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。[2]
  10. 200 OK
  11. 请求已成功,请求所希望的响应头或数据体将随此响应返回。实际的响应将取决于所使用的请求方法。在GET请求中,响应将包含与请求的资源相对应的实体。在POST请求中,响应将包含描述或操作结果的实体。[6]
  12. 201 Created
  13. 请求已经被实现,而且有一个新的资源已经依据请求的需要而创建,且其URI已经随Location头信息返回。假如需要的资源无法及时创建的话,应当返回'202 Accepted'。[7]
  14. 3xx重定向
  15. 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。[2]
  16. 当且仅当后续的请求所使用的方法是GET或者HEAD时,用户浏览器才可以在没有用户介入的情况下自动提交所需要的后续请求。客户端应当自动监测无限循环重定向(例如:ABC→……→AAA),因为这会导致服务器和客户端大量不必要的资源消耗。按照HTTP/1.0版规范的建议,浏览器不应自动访问超过5次的重定向。[16]
  17. 300 Multiple Choices
  18. 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。[17]
  19. 除非这是一个HEAD请求,否则该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由Content-Type定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动作出最合适的选择。当然,RFC 2616规范并没有规定这样的自动选择该如何进行。
  20. 如果服务器本身已经有了首选的回馈选择,那么在Location中应当指明这个回馈的URI;浏览器可能会将这个Location值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的。
  21. 301 Moved Permanently
  22. 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。[18]除非额外指定,否则这个响应也是可缓存的。
  23. 新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。
  24. 如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
  25. 注意:对于某些使用HTTP/1.0协议的浏览器,当它们发送的POST请求得到了一个301响应的话,接下来的重定向请求将会变成GET方式。
  26. 4xx客户端错误
  27. 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。[29]
  28. 如果错误发生时客户端正在传送数据,那么使用TCP的服务器实现应当仔细确保在关闭客户端与服务器之间的连接之前,客户端已经收到了包含错误信息的数据包。如果客户端在收到错误信息后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端所有还未识别的输入缓冲,以免这些数据被服务器上的应用程序读取并干扰后者。
  29. 400 Bad Request
  30. 由于明显的客户端错误(例如,格式错误的请求语法,太大的大小,无效的请求消息或欺骗性路由请求),服务器不能或不会处理该请求。[30]
  31. 401 UnauthorizedRFC 7235
  32. 参见:HTTP基本认证、HTTP摘要认证
  33. 类似于403 Forbidden401语义即“未认证”,即用户没有必要的凭据。[31]该状态码表示当前请求需要用户验证。该响应必须包含一个适用于被请求资源的WWW-Authenticate信息头用以询问用户信息。客户端可以重复提交一个包含恰当的Authorization头信息的请求。[32]如果当前请求已经包含了Authorization证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。
  34. 注意:当网站(通常是网站域名)禁止IP地址时,有些网站状态码显示的401,表示该特定地址被拒绝访问网站。
  35. 5xx服务器错误
  36. 表示服务器无法完成明显有效的请求。[56]这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。这些状态码适用于任何响应方法。[57]
  37. 500 Internal Server Error
  38. 通用错误消息,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。没有给出具体错误信息。[58]
  39. 501 Not Implemented
  40. 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。[59](例如,网络服务API的新功能)
  41. 502 Bad Gateway
  42. 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。[60]