[关闭]
@yanglfyangl 2018-11-26T03:47:26.000000Z 字数 1727 阅读 514

复化文旅
标签: 复化文旅

Test-Assured的设计思路

Overall
Test-Assured是基于Rest-Assured开发的适用于我们的一个测试框架。

虽然Rest-assured很强大了,但因为我们的服务的特殊性,还有如下困难

  • 接口通,如果不通过其它接口做闭环测试的话,无法保证内部逻辑正确。
  • 根据不同的数据测试不同的场景,也很困难。

我们的调用时序图示例:
如果要弄清楚需要什么样的测试框架,需要先了解架构,我们的架构中有类似如下的调用关系:

Created with Raphaël 2.1.2用户用户ControllerControllerServiceA(s)ServiceA(s)DBDBCacheCacheQueueQueueBackendServiceA(s)BackendServiceA(s)JobServiceA(s)JobServiceA(s)写数据写数据写库完成完成写缓存入队列读队列逻辑处理写库写缓存定时处理相关逻辑结果写缓存结果写DB读数据读数据读缓存如果缓存中存在返回否则,读库写缓存返回

架构的优势和劣势:

我们的架构中:
1. 多个中件间不同程度的参与。
2. 通过队列进行了解耦。

这样的优势是:
1. 性能高;计算与主流程是分离的。
2. 易扩容。

这样的劣势是:
1. 开发难度高。
2. 组件之间代码的互相影响概率高。
3. 难于测试。如果不做很全面的业务闭环测试,很难发现一些细小的逻辑错误。

Test-Assured的建议:

  1. //调用Rest接口。
  2. given().
  3. config(RestAssuredConfig.config()
  4. .headerConfig(HeaderConfig.headerConfig().overwriteHeadersWithName("header1")))
  5. .header("header1", "value1")
  6. .spec(specification)
  7. .then()
  8. .get("/multiHeaderReflect")
  9. .expect()
  10. .body(containsString("abc"))
  11. .body(contains("abc"))
  12. //调用接口后进行数据库验证。
  13. String dbresult = DBGiven().
  14. config()
  15. .then()
  16. .getQuery("select * from mysql where XXX")
  17. .expect()
  18. .Results().string(containsString("abc"))
  19. .Results().list(contains("abc"))
  20. //调用接口后进行redis验证。
  21. RedisGiven()
  22. .config()
  23. .then()
  24. .getQuery("key")
  25. .expect()
  26. .Results().string(containsString("abc"))
  27. .Results().list(contains("abc"))
  28. //调用接口后进行ES验证。
  29. EsGiven()
  30. .config()
  31. .then()
  32. .getQuery("match:{}")
  33. .expect()
  34. .Results().string(containsString("abc"))
  35. .Results().list(contains("abc"))
  36. //调用接口后进行ES验证。
  37. String tuResult = TuGiven()
  38. .config()
  39. .then()
  40. .getQuery("g.V(...)")
  41. .expect()
  42. .Results().string(containsString("abc"))
  43. .Results().list(contains("abc"))

未来的开发方式变化

开发新功能:

  • 第一步:讨论设计方案
  • 第二步:接口设计
  • 第三步:数据库或其它数据源设计
  • 第四步:缓存、队列设计
  • 第五步:根据之前讨论的结果,将主要流程用上面的方式写出测试用例。
  • 第六步:开发代码,代码结束的标志是上面的case全部跑通。

功能回归或bug修改:

  • 第一步:分析bug
  • 第二步:进行调试并修改。
  • 第三步:修改完成后跑本模块的test (使用上面的case),提交前不能有失败。
  • 第四步:提交后跑整个系统的case,不能出现新增的失败。如果失败,则需要在当天解决。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注