2. Common Test Basics
2通用测试基础
2.1总则
Common Test
框架是一种支持对任何类型的目标系统执行和自动执行测试用例的工具。Common Test
是作为Erlang/OTP系统开发和维护一部分的所有测试和验证活动中使用的主要工具。
测试用例可以单独或批量执行。Common Test
还具有分布式测试模式,具有集中控制和日志记录功能。有了这个特性,多个系统可以在一个公共会话中独立测试。例如,在运行自动大规模回归测试时,这是非常有用的。
被测系统(SUT)可以由一个或多个目标节点组成。Common Test
包含一个通用测试服务器,与其他测试实用程序一起用于执行测试用例
执行。测试可以从GUI,OS shell或Erlang shell启动。测试套件
是包含要执行的测试用例
(Erlang函数)的文件(Erlang模块)。支持模块
提供测试用例
用于测试的功能。
在黑盒测试场景中,Common Test
基于测试的程序通过标准的O&M和CLI协议连接到目标系统。Common Test
提供了这些协议中的一些(其中大部分作为独立组件和OTP中的应用程序存在)的实现和包装接口。包装程序简化了配置并为记录目的添加了详细信息。Common Test
不断扩展有用的支持模块。但是,请注意,使用任何Erlang/OTP组件进行测试是一项非常简单的任务Common Test
,无需使用Common Test
包装器。这和调用Erlang函数一样简单。支持许多与目标无关的接口Common Test
如通用Telnet和FTP。这些可以是专用的或直接用于控制仪器,交通负载生成器等等。
Common Test
对于白盒测试Erlang代码(例如模块测试)也是非常有用的工具,因为测试程序可以直接调用导出的Erlang函数。实施基本测试套件和执行简单测试所需的开销很小。例如,对于黑盒测试Erlang软件,可以使用Erlang RPC和标准O&M接口。
测试用例可并行处理多个目标系统,仪器和流量生成器的连接,以执行测试所需的操作。并行处理多个连接是其主要优势之一Common Test
,这要归功于Erlang运行时系统中的并发性的有效支持,Common Test
用户可以利用这些优势来实现并发性。
2.2测试套件组织
测试套件组织在测试目录中,每个测试套件可以有一个单独的数据目录。通常,这些文件和目录受版本控制,与其他形式的源代码类似(可能通过诸如GIT或Subversion的版本控制系统)。但是,Common Test
它本身并没有对可能的文件和目录版本提出任何要求(或者没有意识到)。
2.3支持库
支持库包含对所有测试套件或特定功能区域或子系统中的测试套件都有用的功能。除了Common Test
框架提供的通用支持库以及Erlang/OTP提供的各种库和应用程序之外,还可能需要定制(用户特定)支持库。
2.4套件和测试用例
通过运行测试套件(测试用例集)或单个测试用例来执行测试。一个测试套件被实现为一个名为Erlang的模块<suite_name>_SUITE.erl,其中包含许多测试用例。测试用例是测试一个或多个事物的Erlang函数。测试用例是Common Test测试服务器处理的最小单元。
也可以定义称为测试用例组的测试用例子集。测试用例组可以具有与其关联的执行属性。执行属性指定组中的测试用例是以随机顺序,并行还是按顺序执行,以及是否重复执行组。测试用例组也可以嵌套(也就是说,除了测试用例外,一个组可以包含子组)。
除测试用例和组外,测试套件还可以包含配置功能。这些函数旨在用于设置(和验证)SUT(和/或Common Test
主机节点)中的环境和状态,这是测试正确执行所需的。操作示例如下:打开与SUT的连接,初始化数据库,运行安装脚本等。配置可以按套件,每个测试用例组和每个测试用例执行。
测试套件模块必须符合测试服务器callback interface
指定的模块Common Test
。有关详情,请参阅部分Writing Test Suites
。
无论返回值是什么,如果测试用例返回给调用者,则认为测试用例是成功的。但是,一些返回值具有如下特殊含义:
{skip,Reason}
指示跳过测试用例。
{comment,Comment}
在测试用例的日志中打印注释。
{save_config,Config}
使Common Test
测试服务器通过Config
下一个测试用例。
测试用例失败被指定为运行时错误(崩溃),无论终止的原因是什么。如果你有效地使用Erlang模式匹配,你可以利用这个属性。结果是简洁和可读的测试用例函数,看起来更像是脚本而不是实际程序。一个简单的例子:
session(_Config) ->
{started,ServerId} = my_server:start(),
{clients,[]} = my_server:get_clients(ServerId),
MyId = self(),
connected = my_server:connect(ServerId, MyId),
{clients,[MyId]} = my_server:get_clients(ServerId),
disconnected = my_server:disconnect(ServerId, MyId),
{clients,[]} = my_server:get_clients(ServerId),
stopped = my_server:stop(ServerId).
作为测试套件运行时,所有信息(包括输出到stdout
)都记录在许多不同的日志文件中。用户控制台中显示的信息最少(只有启动和停止信息,以及每个失败测试用例的注释)。
每个测试案例的结果都记录在一个专门的HTML日志文件中,该文件是为特定的测试运行而创建的。概览页面显示由表格行表示的每个测试用例,如果案例成功,失败或跳过,则显示总执行时间以及可选的用户评论。对于失败的测试用例,终止的原因也会打印在注释字段中。概览页面有一个指向每个测试用例日志文件的链接,提供任何标准HTML浏览器的简单导航。
2.5外部接口
该Common Test
测试服务器要求的测试套件定义和导出以下强制或可选的回调函数:
all()
返回套件中所有测试用例和组的列表。(必须)
suite()
用于返回套件属性的信息函数。(可选的)
groups()
用于声明测试用例组。(可选的)
init_per_suite(Config)
套件级配置功能,在第一个测试用例之前执行。(可选的)
end_per_suite(Config)
套件级配置功能,在最后的测试用例后执行。(可选的)
group(GroupName)
用于返回测试用例组属性的信息函数。(可选的)
init_per_group(GroupName, Config)
组的功能,在第一个测试用例之前执行。(可选的)
end_per_group(GroupName, Config)
组的配置功能,在最后一个测试用例之后执行。(可选的)
init_per_testcase(TestCase, Config)
测试用例的配置功能,在每个测试用例之前执行。(可选的)
end_per_testcase(TestCase, Config)
测试用例的配置函数,在每个测试用例之后执行。(可选的)
对于每个测试用例,Common Test
测试服务器都需要以下功能:
Testcasename()
返回测试用例属性列表的信息函数。(可选的)
Testcasename(配置)
测试用例函数。