1.本技术涉及软件测试技术领域,具体而言,涉及接口测试方法、装置、电子设备和存储介质。
背景技术:2.在软件开发的过程中,大量的软件错误通常发生在输入或输出范围的边界或边界附近,对程序代码进行边界值的测试是保证程序质量一个非常重要的手段,但是常规的边界值测试会有如下缺点:因为涉及的接口多,对同一接口的多个参数的输入组合,人工组合需要花费大量的时间;单纯依靠人工很难做到穷尽覆盖;同时需要人工查阅接口文档,并根据接口文档中的参数类型确定边界值组合进行测试,不同的测试人员对与参数的边界的理解不一样的,很容易找出误测或者漏测的情况;在项目开发时间特别紧张的情况下,人工的边界值测试很难做到全量组合的覆盖,从而很难达到边界值测试的目的。
技术实现要素:3.有鉴于此,本技术实施例的目的在于提供接口测试方法、装置、电子设备和存储介质,能够提高。
4.第一方面,本技术实施例提供了一种接口测试方法,包括:
5.获取服务程序的接口文档,所述服务程序部署于目标服务器;
6.根据所述接口文档获取参数类型和参数范围;
7.根据所述参数类型和所述参数范围生成输入信息;
8.根据所述输入信息发送到所述目标服务器;
9.接收所述目标服务器返回的请求结果;
10.根据所述请求结果对所述服务程序进行修复。
11.在上述实现过程中,提供了一种自动对服务程序进行修复的方法,首先,获取服务程序的接口文档,基于接口文档可以获取到服务程序的接口信息,具体包括接口的参数类型和参数范围,基于参数类型和参数范围可以确定用于测试的输入信息;将该输入信息发送到目标服务器,根据目标服务器发送的请求结果,能够得到该服务程序所具有的漏洞,因此根据请求结果能够对服务程序进行修复。
12.进一步地,所述参数类型包括:数值类型,所述参数范围包括:数值范围;
13.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:
14.若所述参数类型为数值类型,根据所述数值范围外的值、所述数值范围内的值、所述数值范围的边界值、所述数据类型的边界值中的一种或多种生成所述输入信息。
15.在上述实现过程中,参数类型为数值类型,则取数值范围外的值、数值范围内的值、数值范围的边界值、数据类型的边界值中的一种或多种生成输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
16.进一步地,所述参数类型包括:字符串类型,所述参数范围包括:字符串取值范围;
17.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:
18.若所述参数类型为字符类型,根据所述字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类型字符串、敏感字符中的一种或多种生成所述输入信息。
19.在上述实现过程中,参数类型为字符类型,则取字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类型字符串、敏感字符中的一种或多种生成所述输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
20.进一步地,所述参数类型包括:链表类型;
21.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:
22.若所述参数类型为链表类型,根据所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或多种生成所述输入信息。
23.在上述实现过程中,参数类型可能还会包括数据结构,常见的数据结构有链表,如果参数类型包括:链表类型,则取所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或多种生成所述输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
24.进一步地,所述参数类型包括:条件;所述参数范围包括:约束条件;所述约束条件包括:数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件;
25.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:根据分数限制条件、数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件生成所述输入信息。
26.在上述实现过程中,参数类型可能为条件,参数范围具体为针对条件的约束条件,约束条件可以是数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件,根据上述条件生成输入信息,可以对接口进行多样化进行测试,从而提升服务程序的稳定性。
27.进一步地,所述根据所述输入信息发送到所述目标服务器的步骤,包括:
28.根据所述输入信息生成请求体,将所述请求体发送到所述目标服务器。
29.在上述实现过程中,根据输入信息生成请求体,能够使得请求体被服务器所识别并接收,并且根据输入信息返回请求结果。
30.进一步地,所述服务程序的接口被配置为当所述输入信息不符合所述接口的要求时返回错误信息;
31.所述根据所述请求结果对所述服务程序进行修复的步骤,包括:
32.遍历日志列表,所述日志列表用于存储所述错误信息;
33.当所述日志列表存在所述错误信息时,根据所述错误信息对所述服务程序进行修复。
34.在上述实现过程中,创建了一个日志列表,服务程序的接口设置有相关返回错误信息的设置,当出现错误时,返回错误信息,将该错误信息存储于日志列表,进一步地,可以通过遍历日志列表来进行获取错误信息。
35.第二方面,本技术实施例提供一种接口测试装置,包括:
36.接口文档获取模块,用于获取服务程序的接口文档,所述服务程序部署于目标服
务器;
37.参数获取模块,用于根据所述接口文档获取参数类型和参数范围;
38.输入信息生成模块,用于根据所述参数类型和所述参数范围生成输入信息;
39.发送模块,用于根据所述输入信息发送到所述目标服务器;
40.接收模块,用于接收所述目标服务器返回的请求结果;
41.修复模块,用于根据所述请求结果对所述服务程序进行修复。
42.在上述实现过程中,提供了一种自动对服务程序进行修复的方法,首先,获取服务程序的接口文档,基于接口文档可以获取到服务程序的接口信息,具体包括接口的参数类型和参数范围,基于参数类型和参数范围可以确定用于测试的输入信息;将该输入信息发送到目标服务器,根据目标服务器发送的请求结果,能够得到该服务程序所具有的漏洞,因此根据请求结果能够对服务程序进行修复。
43.第三方面,本技术实施例提供的一种电子设备,包括:存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面任一项所述的方法的步骤。
44.第四方面,本技术实施例提供的一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,当所述指令在计算机上运行时,使得所述计算机执行如第一方面任一项所述的方法。
45.本技术公开的其他特征和优点将在随后的说明书中阐述,或者,部分特征和优点可以从说明书推知或毫无疑义地确定,或者通过实施本技术公开的上述技术即可得知。
46.为使本技术的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
47.为了更清楚地说明本技术实施例的技术方案,下面将对本技术实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本技术的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
48.图1为本技术实施例提供的的流程示意图;
49.图2为本技术实施例提供的的结构示意图;
50.图3为本技术实施例提供的电子设备的结构示意图。
具体实施方式
51.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行描述。
52.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本技术的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
53.在软件开发的过程中,大量的软件错误通常发生在输入或输出范围的边界或边界附近,对程序代码进行边界值的测试是保证程序质量一个非常重要的手段,但是常规的边界值测试会有如下缺点:因为涉及的接口多,对同一接口的多个参数的输入组合,人工组合
需要花费大量的时间.;单纯依靠人工很难做到穷尽覆盖;同时需要人工查阅接口文档,并根据接口文档中的参数类型确定边界值组合进行测试,不同的测试人员对与参数的边界的理解不一样的,很容易找出误测或者漏测的情况;在项目开发时间特别紧张的情况下,人工的边界值测试很难做到全量组合的覆盖,从而很难达到边界值测试的目的。
54.实施例1
55.参见图1,本技术实施例提供了一种接口测试方法,包括:
56.s1:获取服务程序的接口文档,所述服务程序部署于目标服务器;
57.s2:根据所述接口文档获取参数类型和参数范围;
58.s3:根据所述参数类型和所述参数范围生成输入信息;
59.s4:根据所述输入信息发送到所述目标服务器;
60.s5:接收所述目标服务器返回的请求结果;
61.s6:根据所述请求结果对所述服务程序进行修复。
62.上述实施例中,项目开发中,web项目的前后端分离开发,app开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。接口文档中包括了多种信息,包括每个接口的作用,每个接口所接受的参数类型,每个接口返回的参数类型。
63.在上述实现过程中,提供了一种自动对服务程序进行修复的方法,首先,获取服务程序的接口文档,基于接口文档可以获取到服务程序的接口信息,具体包括接口的参数类型和参数范围,基于参数类型和参数范围可以确定用于测试的输入信息;将该输入信息发送到目标服务器,根据目标服务器发送的请求结果,能够得到该服务程序所具有的漏洞,因此根据请求结果能够对服务程序进行修复。
64.在一可能的实施方式中,所述参数类型包括:数值类型,所述参数范围包括:数值范围;
65.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:
66.若所述参数类型为数值类型,根据所述数值范围外的值、所述数值范围内的值、所述数值范围的边界值、所述数据类型的边界值中的一种或多种生成所述输入信息。
67.示例性地,数据类型具体为整型、整型的数值范围为-32768~32767、数值范围为1~100,则可以根据-100~0、1-100、1、100、-32768~32767、-32768、32767生成输入信息。
68.具体地,可以分别将数值范围外的值、所述数值范围内的值、所述数值范围的边界值、所述数据类型的边界值依次发送到目标服务器,也可以根据所述数值范围外的值、所述数值范围内的值、所述数值范围的边界值、所述数据类型的边界值中的一种或多种进行组合生成所述输入信息,将多种输入信息发送到目标服务器。
69.在上述实现过程中,参数类型为数值类型,则取数值范围外的值、数值范围内的值、数值范围的边界值、数据类型的边界值中的一种或多种生成输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
70.进一步地,所述参数类型包括:字符串类型,所述参数范围包括:字符串取值范围;
71.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:
72.若所述参数类型为字符类型,根据所述字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类
型字符串、敏感字符中的一种或多种生成所述输入信息。
73.示例性地,字符串的类型为字母,字符串取值范围为“a~o”,则根据a~z之间的取值、a、z、o、空字符串、特殊类型字符串、敏感字符形成输入信息。其中,特殊类型字符串可以为特殊符号集合、敏感字符包括违禁词等。
74.具体地,可以分别将字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类型字符串、敏感字符进行组合生成所述输入信息,将多种输入信息发送到目标服务器。
75.在上述实现过程中,参数类型为字符类型,则取字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类型字符串、敏感字符中的一种或多种生成所述输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
76.进一步地,所述参数类型包括:链表类型;
77.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:
78.若所述参数类型为链表类型,根据所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或多种生成所述输入信息。
79.示例性地,链表类型定义的数据结构中可能对输入的链表值进行了约束,因此,根据所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或者多种进行组合,得到多种输入信息,将多种输入信息发送到目标服务器,然后获取返回请求结果。基于返回结果进行漏洞修复。
80.在上述实现过程中,参数类型可能还会包括数据结构,常见的数据结构有链表,如果参数类型包括:链表类型,则取所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或多种生成所述输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
81.进一步地,所述参数类型包括:条件;所述参数范围包括:约束条件;所述约束条件包括:数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件生成所述输入信息;
82.所述根据所述参数类型和所述参数范围生成输入信息的步骤,包括:根据分数限制条件、数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件生成所述输入信息。
83.示例性地,常见的条件有数值限制:常见的有分数限制,金币限制,等级限制状态限制:常见的有登录状态;关系限制:常见的有绑定家人关系,好友关系;权限限制:常见的有管理员,普通用户权限。
84.在上述实现过程中,参数类型可能为条件,参数范围具体为针对条件的约束条件,约束条件可以是数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件,根据上述条件生成输入信息,可以对接口进行多样化进行测试,从而提升服务程序的稳定性。
85.进一步地,所述根据所述输入信息发送到所述目标服务器的步骤,包括:
86.根据所述输入信息生成请求体,将所述请求体发送到所述目标服务器。
87.在上述实现过程中,根据输入信息生成请求体,能够使得请求体被服务器所识别并接收,并且根据输入信息返回请求结果。
88.进一步地,所述服务程序的接口被配置为当所述输入信息不符合所述接口的要求时返回错误信息;
89.所述根据所述请求结果对所述服务程序进行修复的步骤,包括:
90.遍历日志列表,所述日志列表用于存储所述错误信息;
91.当所述日志列表存在所述错误信息时,根据所述错误信息对所述服务程序进行修复。
92.在上述实现过程中,创建了一个日志列表,服务程序的接口设置有相关返回错误信息的设置,当出现错误时,返回错误信息,将该错误信息存储于日志列表,进一步地,可以通过遍历日志列表来进行获取错误信息。
93.实施例2
94.参见图2,本技术实施例提供一种接口测试装置,包括:
95.接口文档获取模块1,用于获取服务程序的接口文档,所述服务程序部署于目标服务器;
96.参数获取模块2,用于根据所述接口文档获取参数类型和参数范围;
97.输入信息生成模块3,用于根据所述参数类型和所述参数范围生成输入信息;
98.发送模块4,用于根据所述输入信息发送到所述目标服务器;
99.接收模块5,用于接收所述目标服务器返回的请求结果;
100.修复模块6,用于根据所述请求结果对所述服务程序进行修复。
101.在上述实现过程中,提供了一种自动对服务程序进行修复的方法,首先,获取服务程序的接口文档,基于接口文档可以获取到服务程序的接口信息,具体包括接口的参数类型和参数范围,基于参数类型和参数范围可以确定用于测试的输入信息;将该输入信息发送到目标服务器,根据目标服务器发送的请求结果,能够得到该服务程序所具有的漏洞,因此根据请求结果能够对服务程序进行修复。
102.在一种可能的实施方式中,所述参数类型包括:数值类型,所述参数范围包括:数值范围;所述输入信息生成模块还用于若所述参数类型为数值类型,根据所述数值范围外的值、所述数值范围内的值、所述数值范围的边界值、所述数据类型的边界值中的一种或多种生成所述输入信息。
103.在上述实现过程中,参数类型为数值类型,则取数值范围外的值、数值范围内的值、数值范围的边界值、数据类型的边界值中的一种或多种生成输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
104.在一种可能的实施方式中,所述参数类型包括:字符串类型,所述参数范围包括:字符串取值范围;所述输入信息生成模块还用于若所述参数类型为字符类型,根据所述字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类型字符串、敏感字符中的一种或多种生成所述输入信息。
105.在上述实现过程中,参数类型为字符类型,则取字符串取值范围外的值、所述字符串取值范围内的值、所述字符串取值范围的边界值、所述字符串类型的边界值、空字符串、特殊类型字符串、敏感字符中的一种或多种生成所述输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
106.在一可能的实施方式中,所述参数类型包括:链表类型;所述输入信息生成模块还用于若所述参数类型为链表类型,根据所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或多种生成所述输入信息。
107.在上述实现过程中,参数类型可能还会包括数据结构,常见的数据结构有链表,如果参数类型包括:链表类型,则取所述链表取值范围内的值、所述链表取值范围外的值、所述链表的边界值、空链表中的一种或多种生成所述输入信息,得到的输入信息具有多种组合,能够实现对服务程序的接口的精准测试。
108.在一种可能的实施方式中,所述参数类型包括:条件;所述参数范围包括:约束条件;所述约束条件包括:数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件生成所述输入信息;所述输入信息生成模块还用于根据分数限制条件、数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件生成所述输入信息。
109.在上述实现过程中,
110.在一种可能的实施方式中,所述发送模块还用于根据所述输入信息生成请求体,将所述请求体发送到所述目标服务器。
111.在上述实现过程中,参数类型可能为条件,参数范围具体为针对条件的约束条件,约束条件可以是数值限制条件、等级限制条件、登录状态条件、用户关系条件、权限条件,根据上述条件生成输入信息,可以对接口进行多样化进行测试,从而提升服务程序的稳定性。
112.在一种可能的实施方式中,所述服务程序的接口被配置为当所述输入信息不符合所述接口的要求时返回错误信息;修复模块还用于遍历日志列表,所述日志列表用于存储所述错误信息;
113.当所述日志列表存在所述错误信息时,根据所述错误信息对所述服务程序进行修复。
114.本技术还提供一种电子设备,请参见图3,图3为本技术实施例提供的一种电子设备的结构框图。电子设备可以包括处理器31、通信接口32、存储器33和至少一个通信总线34。其中,通信总线34用于实现这些组件直接的连接通信。其中,本技术实施例中电子设备的通信接口32用于与其他节点设备进行信令或数据的通信。处理器31可以是一种集成电路芯片,具有信号的处理能力。
115.上述的处理器31可以是通用处理器,包括中央处理器(central processing unit,cpu)、网络处理器(network processor,np)等;还可以是数字信号处理器(dsp)、专用集成电路(asic)、现成可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器31也可以是任何常规的处理器等。
116.存储器33可以是,但不限于,随机存取存储器(random access memory,ram),只读存储器(read only memory,rom),可编程只读存储器(programmable read-only memory,prom),可擦除只读存储器(erasable programmable read-only memory,eprom),电可擦除只读存储器(electric erasable programmable read-only memory,eeprom)等。存储器33中存储有计算机可读取指令,当计算机可读取指令由处理器31执行时,电子设备可以执行上述方法实施例涉及的各个步骤。
117.可选地,电子设备还可以包括存储控制器、输入输出单元。
118.存储器33、存储控制器、处理器31、外设接口、输入输出单元各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通信总线34实现电性连接。处理器31用于执行存储器33中存储的可执行模块,例如电子设备包括的软件功能模块或计算机程序。
119.输入输出单元用于提供给用户创建任务以及为该任务创建启动可选时段或预设执行时间以实现用户与服务器的交互。输入输出单元可以是,但不限于,鼠标和键盘等。
120.可以理解,图3所示的结构仅为示意,电子设备还可包括比图3中所示更多或者更少的组件,或者具有与图3所示不同的配置。图3中所示的各组件可以采用硬件、软件或其组合实现。
121.本技术实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有指令,当指令在计算机上运行时,计算机程序被处理器执行时实现方法实施例的方法,为避免重复,此处不再赘述。
122.在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本技术的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
123.另外,在本技术各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
124.功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
125.以上仅为本技术的实施例而已,并不用于限制本技术的保护范围,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
126.以上,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以权利要求的保护范围为准。
127.需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。