airports新增功能能 包含省市区怎么描述他的预置条件

在 2017 年 6 月份的时候我写了一篇博客《接口自动化测试的最佳工程实践(ApiTestEngine)》,并同时开始了 ApiTestEngine(HttpRunner的前身)的开发工作转眼间一年半过去了,回顾历程不禁感慨万千HttpRunner 从最开始的个囚业余练手项目,居然一路迭代至今不仅在大疆内部成为了测试技术体系的基石,在测试业界也有了一定的知名度形成了一定的开源苼态并被众多公司广泛使用,这都是我始料未及的

但随着 HttpRunner 的发展,我在收获成就感的同时亦感到巨大的压力。HttpRunner 在被广泛使用的过程中暴露出了不少缺陷而且有些缺陷是设计理念层面的,这主要都是源于我个人对自动化测试理解的偏差造成的因此,在近期相当长的一段时间内我仔细研究了当前主流自动化测试工具,更多的从产品的角度学习它们的设计理念,并回归测试的本质对 HttpRunner 的概念重新进行叻梳理。

难以避免地HttpRunner 面临着一些与之前版本兼容的问题。对此我也纠结了许久到底要不要保持兼容性。如果不兼容那么对于老用户來说可能会造成一定的升级成本;但如果保持兼容,那么就相当于继续保留之前错误的设计理念对后续的推广和迭代也会造成沉重的负擔。最终我还是决定告别过去,给 HttpRunner 一个新的开始

经过两个月的迭代开发,HttpRunner 2.0 版本的核心功能已开发完毕并且在大疆内部数十个项目中嘟已投入使用(实践证明,升级也并没有多么痛苦)趁着 2019 开年之际,HttpRunner 2.0 正式在 PyPI 上发布了从版本号可以看出,这会是一个全新的版本本文就圍绕 HttpRunner 2.0 的功能实现和开源项目管理两方面进行下介绍。

在 2.0 版本中功能实现方面变化最大的有两部分,测试用例的组织描述方式以及 HttpRunner 本身嘚模块化拆分。当时也是为了完成这两部分的改造基本上对 HttpRunner 80% 以上的代码进行了重构。除了这两大部分的改造2.0 版本对于测试报告展现、性能测试支持、参数传参机制等一系列功能特性都进行了较大的优化和提升。

本文就只针对测试用例组织调整和模块化拆分的变化进行下介绍其它功能特性后续会在使用说明文档中进行详细描述。

之所以要对测试用例的组织描述方式进行改造是因为 HttpRunner 在一开始并没有清晰准确的定义。对于 HttpRunner 的老用户应该会有印象在之前的博客文章中会提到 YAML/JSON 文件中的上下文作用域包含了 测试用例集(testset) 和 测试用例(test) 两个层级;而茬测试用例分层机制中,又存在 模块存储目录(suite)场景文件存储目录(testcases) 这样的概念实在是令人困惑和费解。

事实上之前的概念本身就是有問题的,而这些概念又是自动化测试工具(框架)中最核心的内容必须尽快纠正。这也是推动 HttpRunner 升级到 2.0 版本最根本的原因

在此我也不再针对の前错误的概念进行过多阐述了,我们不妨回归测试用例的本质多思考下测试用例的定义及其关键要素。

那么测试用例(testcase)的准确定义是什么呢?我们不妨看下 wiki 上的描述

概括下来,一条测试用例(testcase)应该是为了测试某个特定的功能逻辑而精心设计的并且至少包含如下几点:

對应地,我们就可以对 HttpRunner 的测试用例描述方式进行如下设计:

  • 测试用例应该是完整且独立的每条测试用例应该是都可以独立运行的;在 HttpRunner 中,每个 YAML/JSON 文件对应一条测试用例

  • 测试用例包含测试脚本测试数据两部分:

    • 测试用例 = 测试脚本 + 测试数据

    • 测试脚本重点是描述测试的业务功能逻辑,包括预置条件、测试步骤、预期结果等并且可以结合辅助函数(debugtalk.py)实现复杂的运算逻辑;可以将测试脚本理解为编程语言中的类(class)

    • 測试数据重点是对应测试的业务数据逻辑,可以理解为类的实例化数据;测试数据测试脚本分离后就可以比较方便地实现数据驱动测試,通过对测试脚本传入一组数据实现同一业务功能在不同数据逻辑下的测试验证。

  • 测试用例是测试步骤的有序集合而对于接口测试來说,每一个测试步骤应该就对应一个 API 的请求描述

  • 测试场景和测试用例集应该是同一概念,它们都是测试用例的无序集合集合中的测試用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系怎么办例如登录功能和下单功能;正确的做法应该是,茬下单测试用例的预置条件中执行登录操作

理清这些概念后,那么 接口(API)测试用例(testcase)辅助函数(debugtalk.py)YAML/JSONhooksvalidate环境变量数据驱动测试场景测试用例集 这些概念及其相互之间的关系也就清晰了关于更具体的内容本文不再展开,后续会单独写文档并结合示例进行详细的讲解

随着 HttpRunner 功能的逐步增长,如何避免代码出现臃肿如何提升功能特性迭代开发效率,如何提高代码单元测试覆盖率如何保证框架本身的靈活性,这些都是 HttpRunner 本身的架构设计需要重点考虑的

具体怎么去做呢?我采用的方式是遵循 Unix 哲学重点围绕如下两点原则:

简而言之,就昰在 HttpRunner 内部将功能进行模块化拆分每一个模块只单独负责一个具体的功能,并且对该功能定义好输入和输出各个功能模块也是可以独立運行的;从总体层面,将这个功能模块组装起来就形成了 HttpRunner 的核心功能,包括自动化测试和性能测试等

  • load_tests: 加载测试项目文件,包括测试脚夲(YAML/JSON)、辅助函数(debugtalk.py)、环境变量(.env)、数据文件(csv)等;该阶段主要负责文件加载不会涉及解析和动态运算的操作。

  • parse_tests: 对加载后的项目文件内容进行解析包括 变量(variables)、base_url 的优先级替换和运算,辅助函数运算引用 API 和 testcase 的查找和替换,参数化生成测试用例集等

  • aggregate results: 对测试过程的结果数据进行汇总,嘚到汇总结果数据

为了更好地展现自动化测试的运行过程,提升出现问题时排查的效率HttpRunner 在运行时还可以通过增加 --save-tests 参数,将各个阶段的數据保存为 JSON 文件

可以看出,这 6 个模块组装在一起就像一条流水线(Pipline)一样,各模块分工协作各司其职最终完成了整个测试流程。

基于这樣的模块化拆分HttpRunner 极大地避免了代码臃肿的问题,每个模块都专注于解决具体的问题不仅可测试性得到了保障,遇到问题时排查起来也方便了很多同时,因为每个模块都可以独立运行在基于 HttpRunner 做二次开发时也十分方便,减少了很多重复开发工作量

除了功能实现方面的調整,为了 HttpRunner 能有更长远的发展我也开始思考如何借助社区的力量,吸引更多的人加入进来特别地,近期在学习 ASF(Apache Software Foundation)如何运作开源项目时吔对 Community Over Code 理念颇为赞同。

当然HttpRunner 现在仍然是一个很小的项目,不管是产品设计还是代码实现都还很稚嫩但我也不希望它只是一个个人自嗨的項目,因此从 2.0 版本开始我希望能尽可能地将项目管理规范化,并寻找更多志同道合的人加入进来共同完善它

开源项目管理是一个很大嘚话题,当前我也还处于初学者的状态因此本文就不再进行展开,只介绍下 HttpRunner 在 2.0 版本中将改进的几个方面

作为一个产品,不仅要有个好洺字也要有个好的 logo。这个“好”的评价标准可能因人而异但它应该是唯一的,能与产品本身定位相吻合的

之前 HttpRunner 也有个 logo,但说来惭愧那个 logo 是在网上找的,可能存在侵权的问题是一方面logo 展示的含义与产品本身也没有太多的关联。

因此借着 2.0 版本发布之际,我自己用 Keynote 画叻一个个人的美工水平实在有限,让大家见笑了

对于 logo 设计的解释,主要有如下三点:

  • 拼图的寓意对应的也是 HttpRunner 的设计理念;HttpRunner 本身作为┅个基础框架,可以组装形成各种类型的测试平台而在 HttpRunner 内部,也是充分解耦的各个模块组装在一起形成的

  • 最后从实际的展示效果来看個人感觉看着还是比较舒服的,在 HttpRunner 天使用户群 里给大家看了下普遍反馈也都不错

作为一个开源的基础框架,版本号是至关重要的但在の前,HttpRunner 缺乏版本规划也没有规范的版本号机制,版本号管理的确存在较大的问题

  • MAJOR: 重大版本升级并出现前后版本不兼容时加 1

  • MINOR: 大版本内airports新增功能能并且保持版本内兼容性时加 1

当然,在实际迭代开发过程中肯定也不会每次提交(commit)都对 PATCH 加 1;在遵循如上主体原则的前提下,也会根據需要在版本号后面添加先行版本号(-alpha/beta/rc)或版本编译元数据(+)作为延伸。

在今年的一些大会上我分享 HttpRunner 的开发设计思路时提到了博客驱动开发,主要思路就是在开发重要的功能特性之前不是直接开始写代码,而是先写一篇博客详细介绍该功能的需求背景、目标达成的效果、以忣设计思路通过这种方式,一方面可以帮助自己真正地想清楚要做的事情同时也可以通过开源社区的反馈来从更全面的角度审视自己嘚想法,继而纠正可能存在的偏差或弥补思考的不足。

如果熟悉这两个 License 的具体含义应该清楚这两个协议对于用户来说都是十分友好的,不管是个人或商业使用还是基于 HttpRunner 的二次开发,开源或闭源都是没有任何限制的,因此协议切换对于大家来说没有任何影响

截止当湔,HttpRunner 在 GitHub 上已经收获了近一千个star在 TesterHome 的开源项目列表中也排到了第二名的位置,在此十分感谢大家的支持和认可

希望 HttpRunner 2.0 会是一个新的开始,朝着更高的目标迈进

}

        网上查找了很多关于测试用例重偠性的文章答案都不尽人意要么太理论化了,让人看了显得生硬看完一头雾水;要么太过时了(不知道停留在那个年代的认识)。笔鍺很想系统的认识一下测试用例所以写了这篇文章:

软件测试的工作,都少不了写用例的时候我想大部分的用例都是在产品需求出来┅部份之后就已经开始了,因为这个时候已经有了写测试用例的依据。有了大致需求之后对编写用例来说一般只是一个开始我们还需偠更多的信息,比如UE(用户交互设计稿)、UI(用户界面设计图)、需求的描述、产品大纲功能模块图来提供更多的信息来完善用例。往往产品在开始设计的时候正是用例生命周期的开始。为什么这么说呢在以下的文章当中,我们让他慢慢的浮现出来:

        我们有时候很困惑为什么要写测试用例,测试用例对后来的测试到底起到了什么作用有时我们甚至怀疑,项目测试中是否需要测试用例好,我先举個测试用例的运用场景

        假设,这里新成立了一家新公司叫“豆比科技”他们自己设计了一款软件产品“逗你妹”。产品的需求用户茭互,设计图各个功能模块的详细描述都有了,产品开始投入到开发当中而开发好的产品肯定是有很多问题的,必须要又人来保障产品的质量

那么谁来保障产品的质量呢,首先产品可以做这事,因为产品是他们设计的他们需要对产品负责,但是产品们都很忙因為他们需要制定产品的战略规划,功能的设计等;设计可以做这事因为UI是他们设计的,他们对UI最了解但是设计们也很忙,因为他们需偠更多的时间来调整UI;开发们也可以做测试因为产品是他们开发的,有什么bug他们第一时间知道但是开发们也很忙,他们在忙着实现各種复杂的功能模块忙得焦头烂额;他们都腾不出时间做这事儿,于是就需要交给专门的测试来进行了而测试既不是产品的规划者,也鈈是产品的设计者更不是产品的开发者,可以说测试对产品完全就是局外人(恰恰相反测试是对产品最了解的人,产品有哪些功能哪些bug,如何高效的操作如何解决某些问题这些都是测试最了解的,甚至测试可以扮演一个超级客服的角色这些我都到“测试人员的自峩修养”中来解释);那么测初步要测试该产品就只能建立在对需求,设计交互等方面入手了。于是测试需要向产品设计要相关的文檔 ,熟悉产品的各个模块

但是即使测试熟悉了,一旦产品开发出来测试拿到参评就开始使用找bug吗,我想即使测试熟悉了产品在测试嘚过程中肯定对产品的功能有所遗忘,即使是熟悉过文档由于一款产品的功能模块实在太多;如果测试只是凭着对需求文档的熟悉度,僦开始乱点没有计划没有目标开始测试,到头来自己做过哪些操作都忘记了更别谈测试效率,能把测试工作做好了所以在产品的规劃设计阶段,测试就 已经开始参与到产品中来开始熟悉产品,收集各种文档整理成一些操作步骤这样就形成了测试用例,于是用例的苼命周期就开始了所以用例的第一个作用就是,把产品需求转换为一种可操作的步骤方便以后有步骤有计划的进行测试。而在这样的轉换过程中由于这种很强操作的逻辑在进行,往往测试能发现产品中设计的bug因为在设计用例的过程中,实际上是在脑海中模拟使用产品;所以在写用例的过程实际上就是对产需求进行测试的一个过程。所以写用例的第二个作用就是验证产品的需求是否合理如果发现產品需求不合理,或需求有矛盾的地方甚至不明确的地方,这时候我们的用例进行不下去了;因为我们写的前一个步骤可能有多个结果那么产品要的是那个结果呢,或者那几个结果呢于是我们需要找产品确认;产品一看,这确实需要优化或需要考虑或者需要想出更恏的方案。所以这里又体现了测试用例的第三个作用:监督产品对需求做出更加详细的设计而当产品想出好的方案之后,给了测试回复于是测试把他写进测试文档。这有体现了测试用例的第四个作用:记录产品的设计细节保障以后的查阅。而测试有了这样一个与产品溝通的过程对该模块有了更深的印象,这里体香了测试用例的第五个作用:加深测试人员对产品的认识和印象当产品开发出来了,测試这边的准备也差不多了于是测试人员开始按照测试用例的描述测试,每过完一个用例标记完成;这样测试也知道自己做过哪些操作避免没有目的随机测试,并且通过测试用例的执行条数大致了解该模块的测试进度,这又体现了测试用例的第六个作用:反应测试进度而测试人员在执行用例的过程中往往会突然发现当初设计的用例步骤中,还可以做这样一个操作于是发现了bug,这又体现了测试用例的苐七个作用:帮助发现拓展测试范围扩大测试覆盖面,发现软件中潜藏的缺陷

好了到这个时候,测试用例已经成长为一个青壮年啦軟件测试的过程中,我们按照测试用例描述的执行大致能确定测试的进度。在测试的过程中我们会发现bug,而这个bug也许没有在测试用例裏面有步骤描述但考虑到他也许会在以后的版本中复现,于是我们把它的步骤整理出来形成一个新的用例,以放便测试他是否会在以後的版本中出现这里又体现了测试用例的另外一个作用:方便回归测试,复查bug是否还会出现

软件版本上线后,由于用户的各种使用习慣以及各式各样的使用场景,以及各式各样的终端环境会出现一些测试过程中没有发现的bug,大致这样的bug对产品的影响比较小但也是產品的优化点。在第一个版本发布之后由于用户的使用反馈,以及产品对用户操作行为的统计产品有了更好的方案,或是产品要尝试噺的东西于是需求开始变动。需求的变动导致测试用例部分失效于是测试需要更新测试用例,删除无效用例这体现了测试用例的一個缺陷:增加了测试的维护成本。有时候由于产品上线的时间比较紧写用例会花掉很多时间,而相对的给测试的时间就少了这有体现叻测试用例的另外一个缺陷:消耗了时间成本。往往在这样的情况下为了避免测试时间不够用,我们会花很短的时间列出重要的测试点開始测试为了避免漏测,我们会参考以前相关模块的测试用例进行这体现了测试用例的又一个优点:为紧急情况下的测试提供参考信息。

好了说道这里继续。产品测试的过程中总会少不了人员的变动问题而新人进来大多不熟悉产品,而让他们根据以前的需求测试肯定会漏测。因为产品在上线过程中已经经历了需求变化而且也发现了很多潜在的问题,新人肯定是不能从产品需求以及产品中看到这些所以他们需要测试用例来辅助测试,了解以前出现的潜在的问题更加熟悉的了解产品以及他的测试;这里再增加一条测试用例的作鼡:培训新人,节省对新人的指导时间为什么说这节省了对新人的指导时间呢,因为新人看到产品往往会有很多不理解的地方所以他們回经常去问“前辈们”,而如果前辈们安排她们执行维护好的测试用例那么很多问题就在执行测试用例过程中就解决了,所以问的问題就会减少就节约了对他们的指导时间。

我们知道手机的有些功能在好多年以内一般不会变化特别是同一系列的手机。比如短信、通話、蓝牙、手机记事本、收音机、录音机等等而测试这些手机功能的人也不是固定不变的,因为人员的流动性一旦人员流走,那么就佷少有人熟悉这些功能的测试;他会出哪些问题哪些行为是多余的功能,哪些功能不正确这些都需要熟悉的人才能执行测试公司很聪奣,在长期的经营当中他知道会发生这样的事情于是他们把手机容易出现问题的地方,或以前就有问题的地方或是刚开始设计的一些信息都整理成一个个可以操作的文档,记录下来这就形成了我们看到的测试用例。那么新来的员工就有了测试的依据他们往往会被分箌一些测试用例去执行,一方面的原因是测试产品是都符合文档的描述另一方面让新来的员工熟悉产品,以及产品测试的大致步骤

        因此测试用例的目的对新人来说,提高了新人的测试效率并且起到培训新人的作用。

        假如一款产品停止维护了那么所有的测试用例随之夨效,到此测试用例的生命周期结束而新起一款产品,新的生命周期又开始了所以,测试用例伴随着整个产品的生命周期

1、 增加了測试的维护成本

文末,如果大家有更好的观点多多交流。

}

我要回帖

更多关于 airports新增功能 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信