新投产系统不可见接口的可信验证方法研究
2023-10-24于萌何紫薇任嘉勉周海旭姜大伟左远清
于萌 何紫薇 任嘉勉 周海旭 姜大伟 左远清
(1.中国民航信息网络股份有限公司北京市民航大数据工程技术研究中心;2.中国民航信息网络股份有限公司研发中心 北京 100000)
中国航信是航空运输旅游业信息技术解决方案主导提供商,航信系统是国务院监管的八大重点系统之一。近年来,随业务发展与国产化进程的推进,越来越多的新系统建成投产,其中不乏配载平衡、旅客服务等关键业务的核心系统。如何确保这些新投产系统功能正常、数据准确,是一个无法回避的难题。在实践中,新系统的投产往往还涉及与老系统的交互、转移等过程,随之产生数据兼容性、接口兼容性等问题,带来更高的风险。通常情况下,对新投产系统功能与数据准确性的验证,是由软件测试部门通过测试环节来完成的,这也是保障软件质量的基础。高文辉[1]着重研究了软件测试中的接口测试部分,并对接口测试必须遵循的原则与要求展开了探索;桑鑫[2]、赵明明等人[3]、杨懂懂等人[4]则强调接口测试自动化的重要性,并对用例脚本生成与测试过程的自动化进行了尝试,这些研究对提升测试部门的能力都有重要意义。但由于测试用例数据的真实性、测试场景的覆盖率、特殊场景的参与度等原因,目前在实际实践中,测试环节仍然会漏过一些关键问题,在投产后实际生产环境下才会被发现。尤其是一些隐藏在新系统内部的不可见接口,由于其深埋在用户的可见区之外,更是难以得到全面测试,出现问题也难以排查,是新系统安全投产的痛点与难点。因此,需要研究探索对应的测试验证方法,做到对这些不可见接口的可信验证,以确保新系统投产的万无一失。
1 新投产系统接口研究
1.1 接口分类研究
系统接口具有多种用途,不同类型的接口对数据质量、保障级别要求都是不同的。不同的数据接口,其自身容易出错的程度也是不同的,因此需要首先对接口分类进行研究,明确区分每一类不同接口的特性,以便对不同的接口实施不同的验证与保障手段。
1.1.1 按接口重要程度
按接口的重要程度,可将其划分为以下几个方面。(1)一般接口。
在一个系统对外的大量接口中,一般接口的数量占比通常来说是最高的,即一个系统的大多数接口可能都是一般接口,但一般接口的故障或数据错误可能并不会带来整个系统核心业务阻断性问题,对核心业务整体运行的影响也在可控范围内。在运维中,一般接口的问题通常可以通过功能降级、功能暂停、替代功能等方法来应对。
(2)重要接口。
在一个系统中,虽然重要接口的数量较少,但其肩负重要任务,通常会对系统核心业务的正常运转带来重大影响。因此,重要接口的可用性与数据准确性都非常重要。在运维中,重要接口的问题通常可以通过功能降级、替代功能等方法来应对,并通过编写应急预案来提升应对的时效性。
(3)关键接口。
在一个系统中,能被称为关键接口的少之又少。关键接口的功能一般无法使用降级、替代等方法进行备份应急,因此一旦关键接口出现可用性问题或数据准确性问题,就会直接阻断核心业务的正常运行,对生产安全造成重大威胁。
对于这样的关键接口,其可用性与数据准确性的保障要求都是最高级别的,并且仅在投产前进行测试与验证是不能满足保障需求的,必须在投产后应在线持续对关键接口的可用性与数据准确性进行监控与保障。
1.1.2 按接口使用目的按接口的使用目的,可将其划分为以下几个方面。(1)命令接口(行为式接口)。
通过该接口传递命令与动作,属于行为式接口;这种接口一般关注的重点在于动作的“有”或“无”;针对命令接口一般采用标准测试流程验证即可保障,因为命令接口一般相对简单,出错概率较低。
(2)数据接口(内容式接口)。
通过该接口传递数据内容,属于内容式接口,但凡有数据信息传递,就存在数据内容的准确性问题。针对数据接口一般需要提升测试与验证级别,对其数据准确性给予深入的验证。
1.1.3 按接口设计来源按接口的设计来源,可将其划分为以下几个方面。(1)原生新接口。
原生新接口指的是新系统从零开始,全新设计与实现的接口。这种接口没有历史包袱与束缚,不需要考虑兼容,可以获得对新接口内容项最原始、最全面的理解与把控。因此,原生新接口的出错概率相对较低。
(2)转移老接口。
转移老接口,是测试验证的难点与重点。转移老接口指的是该接口在老系统中存在一个现有版本,新系统需要更新版本,该新版本可以用于老版本的转移与替换。由于要考虑接口格式的兼容问题,很多字段将从老接口带入到新接口中;而新接口的需求设计人员对老接口字段可能存在了解深度不够、理解偏差等问题,造成新接口“形似而神异”。另外,新接口字段在设计时可能还隐晦地存在与老接口字段之间的数值精度差异等潜藏问题,都导致老接口的转移成为问题高发区,且常常具有问题潜伏深、特殊场景多、数值错误不易发现等特点,使新接口隐患重重,数据可信度低下。
1.1.4 按接口可观测性
按接口的设计来源,可将其划分为以下几个方面。
(1)可见接口。
可见接口是指接口的内容可以较为简单地被用户观测与理解,从而可以较为容易地被用户感知到错误和问题,因此,对可见接口的测试与验证较为简单。例如:一个明文传递标准业务报文的接口,用户如果可以在某个前端或工具上直接观测到该接口上传递的业务报文,从而可以较为简单地确认该接口是否正常地运作。
(2)不可见接口。
不可见接口是指接口的内容被封装或编码,并在系统内部被使用与转换,无法被用户直接观测与理解,其使用机器语言进行沟通,在系统之间进行内部处理。例如:离港系统给配载系统提供航班值机数据的LCI接口,其首先是一个转移老接口,兼容了传统大型机离港系统提供的LCI 数据格式,使用了一种结构化的数据编码,无法被用户直接理解。LCI 接口数据送达配载系统后,配载系统会使用这些LCI 数据进行进一步的加工与运算,最终呈现给用户观测到的是加工运算后的结果,这就造成LCI 接口的内容被配载系统进一步隐藏在用户的可见范围之外。接口中的数据一旦出现问题,用户感知到的已经是连锁影响后的结果,因此对不可见接口的测试验证是难点与重点。
1.2 接口特性研究
通过上述对接口各种分类方法的研究,可以看到不同类型的接口有其各自的特点。下文将进一步对其中通用的特性抽取出来进行分析与研究。
1.2.1 接口的可信性
接口的可信性指的是因这个接口的特点而带来的这个接口可以被信赖的程度,可反映出该接口的易出错程度。
影响接口可信性的因素包括以下几个方面。
(1)是否是数据接口。命令接口相对简单不易出错,而数据接口相对复杂,较易出错。
(2)是否是从老接口转移而来。兼容老接口会带来更多的出错点,更易出现错误。
(3)是否经过多层数据加工。接口中的数据每多一层加工处理,数据出错的可能性就多上升一层。
一个接口的可信性越高,代表这个接口越不容易出错,其对测试与验证的要求就越低;另一个接口的可信性越低,代表这个接口越混乱,越容易出错,其对测试与验证的要求就越高。
1.2.2 接口错误的可感知性
接口错误的可感知性指的是当一个接口发生错误时,该错误可被用户感知的难易程度,亦可反映出该接口发现问题的难易程度。
影响接口错误可感知性的因素具体包括以下几个方面。
(1)是否接口可见。隐藏在系统内部的不可见接口往往无法被用户感知。一旦不可见接口出现数据问题,用户看到的是经过转换与计算后的错误结果,很多时候无法很快确定具体是哪里出了问题。
(2)是否经过多层封装与处理。接口数据每多一层处理与包装,接口中数据的原始错误被感知到,并被尽快发现的可能性就下降一层。
接口的可信性决定了需要对该接口执行的测试与验证工作力度要求,接口错误的可感知性决定了这个接口测试与验证工作的难度,而接口的重要程度分类,决定了对该接口进行测试与验证工作的必要性。
1.3 接口的验证保障层次
针对接口不同的特性特点,划分出3 个等级的测试验证保障级别。
1.3.1 常规测试
常规测试的执行成本最低,并可以很好地保证目标功能的基础质量。
对于一般接口、命令接口、原生新接口、可见接口、可信性高的接口,适合使用常规方式开展验证与测试。
1.3.2 “常规测试+离线回放验证”
加入离线回放验证环节会显著增加测试执行成本,但能够有效提升测试用例的真实性,达成更好的测试验证效果。
对于重要接口、数据接口、转移老接口、不可见接口、可信性低的接口,适合使用常规测试加离线回放验证的方式开展验证与测试。
1.3.3 “常规测试+离线回放验证+在线外挂式复核”
在线外挂式复核方法的引入,将整个验证与保障范围从投产前延伸到了投产后;新投产系统的个别关键接口,在投产后的一段时期内将继续处于在线外挂式复核工具的保护之下。
对于关键接口这样绝对不允许出错的接口,适合结合使用常规测试、离线回放验证、在线外挂式复核的方式共同进行验证。
2 可信验证方法研究
2.1 原因分析
可信验证方法研究首先需要分析常规测试方法无法达到可信验证的原因。常规测试方法的功能覆盖全面性与问题发现效率往往直接依赖于测试用例的数量与质量,而测试用例的数量与质量又取决于测试人员的能力与素质,其结果往往存在较大波动,且传统的用例测试方法存在一些固有的局限性。例如:测试用例设计与生产实践的偏差,开发者理性设计与用户感性操作的偏差,往往让很多问题在测试环节无法被发现,直到投产实践中由用户触发后,系统所有者才会惊讶地感叹原来用户竟然还有这种操作,这些操作导致现有的测试结果不再那么可信,进而造成投产信心下降。
问题的核心就是测试用例数据,其被局限在了系统投产以前,与现有的生产实践数据产生了割裂。因此,如果能将现有的生产数据引入到测试过程中,系统的验证可信度将迎来一个大幅度提升。
3 针对不可见接口不同阶段的可信验证方法
3.1 离线回放验证方法
离线回放验证是指在现有系统(或可类比的同类业务系统)中,记录并保存用户的所有操作动作与执行结果,然后将其在新系统中进行离线回放,并对执行结果进行比对与分析,从而确认新系统是否具备承接目前用户业务能力的一种方法。它并不是一个新概念,黄宁等人[5]在网络安全领域中就曾提出过一种面向目标网络的流量回放方法,以解决目前用户行为仿真规模逼真度不高的问题,并证明这种方法是行之有效的;郑筝等人[6]也通过对HTTP流量进行录制与回放,以尝试实现自动化测试功能。
这种验证方法实际上也可以在线运行,被称为在线整合验证(ONLINE SIT),即将实际生产请求同时分流到现有系统与新系统,两边同时运行并进行结果比对分析。这种用实际生产数据与生产流量来冲击待验证系统是一种效果非常好的验证手段,能够提前发现很多常规测试中难以发现的问题,有效提升新系统投产的成功率。但由于关键核心系统往往处于整个业务社区的中心位置,并通过多个接口与周边系统相连,因此在实践中,对于关键核心系统开展在线整合验证往往困难重重,核心系统与外系统之间的实时交互接口会成为ONLINE SIT难以回避的重大障碍,而断掉这些接口又会导致这些重要接口无法得到验证,使整个验证结果大打折扣。而离线回放的验证方式可以在非生产环境运行,并通过在非生产环境搭建全套关联系统来模拟生产环境。因此离线回放验证方法往往可以达成更好的验证可信度,并且与生产环境完全隔离,天然具备更好的执行安全性。
离线回放验证可以有多种实现方法与数据来源。在中国航信新离港系统投产项目中,采用的是基于老系统生产航班跟踪带数据的离线回放验证方式,如图1所示;该方法可实现基于离港航班全生命周期的、全操作流程的跟踪带回放验证功能。
图1 基于跟踪带的离线回放验证
该套回放验证体系包括对目标验证航班参数的灵活配置、全自动的跟踪带读取与分析、全自动的目标验证航班操作序列生成、基于操作序列的验证回放与全过程结果比对。
通过在投产前对大量航班进行离线验证,可以模拟真实生产航班的全量生产操作,在数据与操作两方面实现投产前的有效验证。
离线回放验证的最大特点是使用生产数据与生产操作,并采用结果比对方式进行正确性验证,杜绝主观影响,使最终结果更加真实可信;同时,在回放过程使用集成联调环境,能够全面地验证功能与接口。
上述特点与关键点是离线回放验证结果被认为是可信的关键因素。
3.2 基于可视数据的外挂式复核方法
基于可视数据的外挂式复核验证方法,就是将自身视为第三方审核者,以一个外部挂件的方式审视新系统展示出来的数据,然后以自身的逻辑来判断系统数据是否准确。
对于重要程度达到了关键层次的接口,尤其是涉及了安全这种决不允许有失的业务场景,有必要启用外挂式复核方法。例如:配载系统与离港系统之间的值机数据接口(LCI),其交互数据参与飞机载重平衡计算,直接关乎飞行安全,任何数据上的错误都是不允许的。因此,对于LCI这样一个关键接口,就需要使用外挂式复核方法来确保其数据的准确性。
3.2.1 选择外挂式复核方法的原因
(1)目标接口的特点。
作为关键接口,很可能面临最复杂的情况与场景,即该接口是一个经由老系统转移过来的、复杂的、不可见的数据接口,其接口可信性很低,接口错误的可感知性也很低,如LCI接口,就完全符合这些条件。这样的一个深埋在系统内部的复杂接口,数据经过层层加工处理,采用传统的测试手段几乎无法做到场景的覆盖,而使用回放验证手段也受限于回放数据的范围,同样不能完全确保全场景覆盖。而且由于接口数据是经过加工处理封装后的数据,导致直接对接口数据进行验证与分析会非常困难。同时,针对接口字段开展的验证,容易落入这样一个窘境,即新系统接口对数据的理解加工错了,则验证算法也同样理解加工错了。在实践中这其实是非常容易出现的问题,因为这种针对字段的“同质加工”,由于大家在现阶段对该字段的理解是趋同的,所以很容易导致同一个错误在原始算法与复核算法中同时出现。
(2)验证的可信性。
“同质加工”趋势导致验证算法一并出错的概率是很高的,因此简单地根据数据加工算法“重写”另一套数据验证算法,以此来对接口数据进行验证的“可信”性是非常值得怀疑的。而使用用户可见数据进行计算,并将其结果作为验证依据,是可以称为“可信”的,基于如下几点考虑。
①眼见为实。用户可以直接看见的数据,是用户最为相信的数据;用户看见的结果,是用户最为相信的结果。②可见数据具有最好的纠错性。因为一旦可见数据出现错误,其可以被用户迅速地感知与发现,并迅速地进行报告与调整修复。③可见数据正确即最终结果正确。对用户而言,如果可见数据正确,意味着由所有可见数据计算而出的最终结果也应该是正确的。④最终结果正确性高于一切。以最终用户可见结果为标准进行复核验证,可以完全保证最终结果的正确性;对于安全性相关接口,如LCI接口,最终计算结果的正确性是大于一切的。
因此,基于以上讨论与思考,不能直接针对接口数据本身进行复核与验证,以避免落入“同质加工”的困境。需要把目光聚焦在用户的可视数据上,复核的内容集中在最终计算结果上,以最终结果的匹配与比对来反证关键接口数据的准确性。
3.2.2 复核验证体系的设计
设计与实现了基于用户视角的、外挂式的复核验证体系,如图2所示。
图2 基于可视数据的外挂式复核方法
该外挂复核体系可以使用只读工作号从用户视角全自动获取目标验证航班的相关数据,并基于这些可见数据进行全自动的计算。由外挂工具计算出来的结果将与新系统使用接口数据计算出的结果进行全自动的复核比对,生成的结果报告将实时邮件通知投产支持与维护人员。
该体系的最大特点是基于可视数据,所见即所得,且比对的是最终结果,确保关键数据的最终结果正确,可信度高。该体系采用外挂式设计,模拟用户视角,运行时仅需使用用户级只读工作号,对系统的影响最小化,特别适合作为在线守护进程来为关键接口提供安全的实时比对复核服务。
该体系彻底规避了新投产系统内部接口不可信、不可见的种种难题,以对现有系统最小的影响,实现了现阶段最可信的计算结果复核比对,是新系统关键接口安全投产的“定心丸”。
4 应用效果分析
对不可见接口做可信验证的研究成果在中国航信新离港系统的建设与试投产过程中进行了应用。经过接口分析,识别出LCI接口为关键接口,急需以最高的要求与标准进行测试与验证复核;同时,还识别出其他一系列重要接口需要进行高标准的测试与验证。
为此,针对新离港系统的特点,在继续加强开展所有常规测试活动的基础上,最终确定对其在投产前增加基于老系统跟踪带的离线回放验证与基于可视数据的外挂式配载复核验证,以增强所有功能与接口的可信性,并在投产后继续开展外挂式配载复核验证,以在线守护关键接口的数据安全,具体情况详见图3。
图3 在新离港系统应用回放验证与外挂复核验证
在2019—2020年新离港系统试投产的准备期间,测试验证团队成功对近2 000 实际生产航班开展了的全流程离线回放验证与外挂式配载复核验证工作,成功检出并修正了多个潜藏在LCI关键接口与其他重要接口中的问题隐患。
2020年末,新离港系统成功进行了为期一个月的投产试运行。使用期间,系统运行平稳正常,在线的外挂配载复核服务同步部署,为所有投产的离港航班提供配载复核服务,并实时为投产支持人员与后台运维人员提供航班状态报告,确认每一个投产航班的数据安全,如图4所示。
图4 开放离港系统投产航班外挂配载复核结果通报
新离港系统试投产的成功,证明了以离线回放验证与外挂式复核为主体的可信验证方法,在投产前测试验证与投产后守护保障两方面均达到了预定的研究目标,完全可以成为保障新系统未来进一步安全投产的重要力量。
5 结论
在对新投产系统接口研究方面,由于其往往具有不同的类型与特性,针对不同特点的接口因地制宜地开展不同的验证与复核保障是最优选择。因此,在研究接口各维度分类的基础上,根据接口的不同特性与需求,提出了3个层次的验证与保障级别模型。该模型可成为未来接口验证保障级别评定的重要参考依据。
在可信验证研究方面,基于跟踪带的离线回放验证方法,与基于可视数据的外挂式验证复核方法,是实现可信验证落地的重要研究成果,也是支撑三层验证与保障级别模型的重要支柱。使用这套接口分类与保障分层的结构模型,可以对各系统的接口进行通用的分类与划分,明确其推荐的保障级别,并参考相应推荐的可信验证方法,为其设计适合的验证与复核方案。
在新离港系统试投产实践中对上述可信验证方法的成功应用,也为其他系统进一步开展可信验证工作提供了理论依据与实践样例。