小猿“思前享后”为大家分享优质内容!————Share猿
7. Tests
7.1. Tests
测试是Tigase服务器开发过程中非常重要的一部分。
每个版本都要经过完全自动化的测试过程。所有服务器功能都被考虑只有当它们通过测试周期时才会实现。Tigase测试套件适用于我们所有的自动测试,允许定义不同的测试场景。
在数据库中没有对测试进行调整。所有的数据库都以标准的方式安装使用默认设置运行。在测试周期开始之前,数据库被清除。
对于Tigase的配置文件也不需要进行任何修改。所有的测试在配置向导生成的默认配置上执行。
服务器在所有受支持的环境中进行测试:
- XMLDB-使用内置的简单XML数据库进行测试。这是一个简单而有效的解决方案。它被推荐为拥有最多100个用户帐户的服务,尽管它已经成功地测试了10 000个用户帐户。
- 2.MySQL——使用MySQL(http://www.mysql.com/)数据库进行测试。比xmxml慢得多可以处理更多的用户帐户。
- 3.PostgreSQL——带有PostgreSQL(http://www.postgresql.org/)数据库的测试。又得多比XMLDB慢,但可以处理更多的用户帐户。这基本上就是与MySQL数据库(SQL连接器)相同的代码,但是执行测试以确保代码与所有受支持的SQL数据库兼容,并比较性能。
- 4.Distributed。分布式-是对分布式安装的测试,其中c2s和s2s组件运行在
使用外部组件协议连接的分离机(XEP-0114
(http://www.xmpp.org/extensions/xep-0114.html))到另一台带SessionManager的机器运行。
7.1.1.功能测试
基本检查,看看是否所有的函数都正确工作。这些测试每次都执行代码被发送到源存储库。
7.1.2. Performance Tests(性能测试)
检查这个函数是否执行得足够好。
7.1.3.稳定性测试
检查该函数是否在长期运行中表现良好。它必须处理上百个在几个小时的服务器运行中请求第二个请求。
7.2. Tigase测试套件
Tigase测试套件是一个允许您运行测试的引擎。本质上,它只是执行TestCase实现。测试可能依赖于其他测试,这意味着它们将被执行特定的顺序。例如,身份验证测试是在流公开测试之后执行的在网络套接字连接测试后执行转。
每个TestCase实现都有自己的特定参数集。有一组可以应用于任何TestCase的通用参数。作为一个共同的例子您可以使用-loop=10,指定TestCase必须执行10次。测试特定的参数可能是-用户名=测试人员,它可以设置用户名验证测试。
引擎是非常通用的并且允许你编写任何类型的测试但是对于Tigase项目当前的TestCase实现模仿XMPP客户机,并被设计用来测试XMPP服务器。
7.2.1. 运行Tigase测试套件(TTS)
要获得TTS,您首先需要克隆存储库
git clone https://repository.tigase.org/git/tigase-testsuite.git
克隆完成后,导航到TTS根目录并使用maven编译:
mvn clean install
Maven将编译TTS并将jar放在必要的位置。从同一个目录,你可以使用以下命令开始运行TTS:
./scripts/all-tests-runner.sh
您应该看到以下内容,它概述了定制测试运行的可能选项
Run selected or all tests for Tigase server
----
Author: Artur Hefczyc <artur_hefczyc@vnu.co.uk>
Version: 2.0.0
----
--help|-h This help message
--func [mysql|pgsql|derby|mssql|mongodb]
Run all functional tests for a single database configuration
--lmem [mysql|pgsql|derby|mssql|mongodb]
Run low memory tests for a single database configuration
--perf [mysql|pgsql|derby|mssql|mongodb]
Run all performance tests for a single database configuration
--stab [mysql|pgsql|derby|mssql|mongodb]
Run all stability tests for a single database
configuration
--func-all Run all functional tests for all database
configurations
--lmem-all Run low memory tests for all database
configurations
--perf-all Run all performance tests for all database
configurations
--stab-all Run all stability tests for all database
configurations
--all-tests Run all functionality and performance tests for
database configurations
--single test_file.cot
--other script_file.xmpt
----
Special parameters only at the beginning of the parameters list
--debug|-d Turns on debug mode
--skip-db-relad|-no-db Turns off reloading database
--skip-server|-no-serv Turns off Tigase server start
--small-mem|-sm Run in small memory mode
-----------
Other possible parameters are in following order:
[server-dir] [server-ip]
定制Tigase测试套件
您可以从上面的命令行运行测试,但是您可以创建和编辑/scripts/tests-runner-settings.sh。用于安装您的Tigase安装,避免使用长时间这个模板的复杂命令显示:
#!/bin/bash
func_rep="func-rep.html"
perf_rep="perf-rep.html"
db_name="tigasetest"
db_user="tigase"
db_pass="tigase"
root_user="root"
root_pass="root"
TESTS=("derby" "mysql" "pgsql" "mssql")
IPS=("127.0.0.1" "127.0.0.1" "127.0.0.1" "127.0.0.1")
server_timeout=10
server_dir="/home/tigase/tigase-server"
database="derby"
#database="mysql"
server_ip="127.0.0.1"
MS_MEM=100
MX_MEM=1000
SMALL_MS_MEM=10
SMALL_MX_MEM=50
这将允许您通过多次运行TTS来维护相同的设置。请参见下学习脚本语言如何工作的部分,以及如何创建和运行您的自定义测试。
7.3.测试套件脚本语言
测试套件包含脚本语言,允许您将测试用例合并到一个测试中场景。在最低的层次上,语言的设计是为了让你描述通过设置测试参数、测试注释、标识等进行测试。
让我们看一下示例测试描述。
Short name@test-id-1;test-id-2: Short description for the test case
{
-loop = 10
-user-name = Frank
# This is a comment which is ignored
}
>> Long, detailed description of the test case <<
所有元素的意义:
-
Short name你想要什么描述性的名字。它不需要是唯一的,只是一些东西
它告诉你这个测试是关于什么的。@是短名称和测试之间的分隔符id。
2.** test-id-1;test-id-2**是一个分号分隔的测试用例id。测试用例被执行以列出的顺序。在那里列出它们意味着test-id-2依赖于test-id-1。通常你不需要列出所有的依赖项因为所有的强制依赖项自动包含。也就是说,如果你有一个认证测试用例自动添加网络套接字连接和流开启测试。有时但是,有一些依赖项是可选的或多个强制依赖项你需要选择要执行的那个。一个很好的例子是认证测试用例。有很多认证测试:纯认证,PLAIN-AUTH, SASL-DIGESTMD5, SASL-PLAIN, DIGEST-AUTH,它们都是大多数其他测试的强制要求比如 tests,roster,到场等等。其中一个身份验证测试是默认的依赖关系,但是如果您将使用不同的身份验证,而不是默认的身份验证。
3.:是测试用例id列表和简短测试描述之间的分隔符。 - Short test description放置在:-冒号和开-花括号之间。这是通常很简短,单行测试描述。
- { }花括号包含所有的测试参数,比如测试的次数在一个单独的线程中执行或运行测试,用户名,网络的主机IP地址连接和许多其他人。
-
<<内,测试描述。
至于在开花括号和关闭括号之间的测试脚本你可以把所有的测试放在一起你希望的情况下参数。它的格式是:
-parameter-name = value
参数名称总是以-。注意,有些参数不需要任何值。他们可以在没有任何价值的情况下独立存在:
-debug-on-error
如果你把yes或true作为值,就会模仿。
脚本语言还包括对可以分配任何值的变量的支持以后多次使用。你给变量赋值的方式和你分配给它的方式是一样的
参数:
$(variable-name) = value
变量名必须总是用括号括起来(),然后以$开头。
该值可以在双引号内括起来,“或者双引号可以省略。如果这是一个简单的字符串,比如数字或字符串,只包含数字、字母、下划线还有连字符——然后你可以省略双引号,否则你必须附上它的值。
测试用例描述可以嵌套在其他测试用例描述中。嵌套的测试用例描述继承了来自外部测试用例描述的参数和变量。
7.4.为插件编写测试
您可以在一个简单的文本文件中编写测试,该文件是在测试套件运行时加载的。
您只需要指定应该发送给服务器的内容以及应该预期的响应从服务器。不需要编写Java代码并重新编译整个测试套件以进行新的测试。它意味着新的测试用例可以轻松快速地写出来,希望更多对服务器进行详细的测试。
它是如何运作的
让我们使用XEP-0049(http://www.xmpp.org/extensions/xep-0049.html)私有XML存储。看在规范中我们可以看到第一个例子:
例1。客户端存储私有数据
客户端:
<iq type="set" id="1001">
<query xmlns="jabber:iq:private">
<exodus xmlns="exodus:prefs">
<defaultnick>Hamlet</defaultnick>
</exodus>
</query>
</iq>
服务端:
<iq type="result" id="1001"/>
这对于第一个简单的测试来说已经足够了。我必须创建文本文件JabberIqPrivate。测试看是这样的:
send: {
<iq type="set" id="1001">
<query xmlns="jabber:iq:private">
<exodus xmlns="exodus:prefs">
<defaultnick>Hamlet</defaultnick>
</exodus>
</query>
</iq>
}
expect: {
<iq type="result" id="1001"/>
}
现在我可以执行测试了:
testsuite $ ./scripts/all-tests-runner.sh --single JabberIqPrivate.test
Tigase server home directory: ../server
Version: 2.8.5-b422
Database: xmldb
Server IP: 127.0.0.1
Extra parameters: JabberIqPrivate.test
Starting Tigase:
Tigase running pid=6751
Running: 2.8.5-b422-xmldb test, IP 127.0.0.1...
Script name: scripts/single-xmpp-test.xmpt
Common test: Common test ... failure!
FAILURE, (Received result doesnt match expected result.,
Expected one of: [<iq id="1001" type="result"/>],
received:
[<iq id="1001" type="error">
<query xmlns="jabber:iq:private">
<exodus xmlns="exodus:prefs">
<defaultnick>Hamlet</defaultnick>
</exodus>
</query>
<error type="cancel">
<feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
<text xml:lang="en" xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
Feature not supported yet.</text>
</error>
</iq>]),
Total: 100ms
Test time: 00:00:02
Shutting down Tigase: 6751
如果我刚开始处理这个XEP并且服务器端没有代码,结果是虽然这不是我们想要的,但这是完全意料之中的。在工作了一段时间后服务器代码,我可以再次执行测试:
testsuite $ ./scripts/all-tests-runner.sh --single JabberIqPrivate.test
Tigase server home directory: ../server
Version: 2.8.5-b422
Database: xmldb
Server IP: 127.0.0.1
Extra parameters: JabberIqPrivate.test
Starting Tigase:
Tigase running pid=6984
Running: 2.8.5-b422-xmldb test, IP 127.0.0.1...
Script name: scripts/single-xmpp-test.xmpt
Common test: Common test ... success, Total: 40ms
Test time: 00:00:01
Shutting down Tigase: 6984
这是它。我们想要的结果是简单而有效的。我们可以重复很多次在长期的试验中,这一点尤其重要。每次我们更改服务器代码我们可以重新运行测试,以确保我们从服务器得到正确的响应。
你可以看一下当前的构建,有了更完整的测试用例,JabberIqPrivate文件。(https://projects.tigase.org/projects/tigase-
testsuite/repository/revisions/master/entry/tests/data/JabberIqPrivate.cot)
现在我的服务器测试不再过时了。当然,并不是所有的案例都这么简单。一些XEPs要求在节被发送之前进行计算,或者比较收到的结果。一个好的
这个例子的例子是用户认证,比如SASL,甚至是非SASL。但是,有许多可以通过简单测试来解决的案例:roster 管理,隐私列表管理,vCard,私有数据存储等等
7.5.测试用例参数描述
有一长串参数可以应用于任何测试用例。这是对所有可能的参数,可以用来构建测试场景。
7.5.1.测试报告配置
有测试报告参数,必须在主脚本文件中设置,以便生成来自测试的HTML报告。这些参数没有效果是在测试用例中设置的描述。
- -version = 2.0.0设置测试脚本版本。这是用来方便检测不相容的当测试套件加载为该套件的最新版本创建的脚本时出现的问题不适合这个版本。
- -output-format = (html | html-content)设置测试报告的输出格式。有实际上现在只有一种格式——HTML。这两者之间的唯一区别选项是HTML格式创建带有HTML标题和正文的完整HTML页面。那另一方面,html-content格式只创造了元素内部的内容。和用于将测试结果嵌入到其他HTML内容中。
- -output-file = "report-file.html"设置测试报告的文件名。
- -output-history = (yes | no) 设置测试套件间发送的所有协议数据的日志记录
XMPP服务器。一般来说,对于功能测试,建议将其设置为yes,但对于所有人
其他测试,如性能或负载测试,应该设置为no。
- -output-history = (yes | no) 设置测试套件间发送的所有协议数据的日志记录
- -history-format = separate-file将协议数据记录设置为一个单独的文件。目前这是唯一可能的选择。
- -output-cols = (5 | 7) 只有有效的值是:
5: "Test name", "Result", "Test time", "Description" [, "History" ]
7: "Test name", "Result", "Total time", "OK", "Average", "Description" [, "History" ]
- -title= 报告页面的标题“这个参数设置了被放置的测试报告标题在HTML。页面在 <title/>元素中,以及在第一个页面标题中。
7.5.2.基本的测试参数
这些参数可以设置在每个测试用例的基础上,但是通常它们是在主脚本文件中设置的将它们应用到所有的测试用例中。
- -base-ns = "jabber:client"设置XMPP中用于XML流的XML名称空间连接。一些测试用例可以用来测试客户端到服务器协议以及服务器,服务器协议和可能在将来添加的不同协议。
- -debug交换机调试模式。测试套件和测试套件之间的所有通信服务器被打印到文本控制台和所有其他调试信息,包括java异常也会显示出来。当某些测试失败时,它找到原因特别有用。
- -debug-on-error 在错误检测上的调试模式。通常调试输出生成大量的消息,使输出非常难以阅读。特别是在性能测试不仅可以读取协议数据的快速滚动条,还可以读取数据减慢测试。然而,如果一切运行良好,这个选项就会关闭调试功能。然后,如果我们检测到任何测试错误,就会生成调试输出。
- -def-auth = (auth-plain | auth-digest | auth-sasl)设置默认身份验证方法为用户连接。
- -def-stream = (stream-client | stream-server | stream-component | stream-bosh)设置要测试的连接流和连接的名称空间。
- -host = "host.name" 测试服务器运行的vhost名。它可能是真正的DNS名称
或者只是配置为测试目的主机名,它必须匹配服务器配置。
- -host = "host.name" 测试服务器运行的vhost名。它可能是真正的DNS名称
- -keys-file = "certs/keystore"设置keys store文件的位置。不需要碰它。
- -keys-file-password = keystore设置密钥库文件的密码。通常你不要碰它。
- -serverip = "127.0.0.1"定义XMPP服务器IP地址。你可以省略这个参数
然后,IP地址将根据服务器DNS地址自动确定。但是如果DNS地址不能正确解析或者在本地主机上运行测试您可以使用这个参数来强制IP地址。
- -serverip = "127.0.0.1"定义XMPP服务器IP地址。你可以省略这个参数
- -socket-wait = 10000将网络套接字超时设置为毫秒为最大时间测试套件将等待来自服务器的响应。你可能想要增加一些特定测试的超时,这些测试需要大量的计算或数据库活动服务器。通常10秒对于大多数情况来说是足够的。
- -stop-on-fail = true使脚本在第一个失败的测试用例中终止所有动作。它帮助诊断故障点的服务器状态。
- -trust-file = "certs/client_truststore"为客户端信任存储文件设置文件名。没有
需要改变它。
- -trust-file = "certs/client_truststore"为客户端信任存储文件设置文件名。没有
- -trust-file-password = truststore设置信任存储文件的密码。通常你不用碰它。
- -user-name = tester设置测试之间的XMPP连接使用的用户名套件和XMPP服务器。它通常在所有测试和一些测试中都是相同的就像接收服务器配置一样,您可能想要使用一个不同的帐户(带有admin权限)。然后您可以为这个特定的测试用例设置不同的用户。
- -user-pass = tester-password设置用于XMPP连接的用户的密码在测试套件和XMPP服务器之间。
- -user-resr = resource为XMPP连接设置用户JID资源部分测试套件和XMPP服务器。
7.5.3. 测试用例的参数
测试参数通常在每个测试用例的基础上设置,并且只应用于它们的测试设置和所有继承的测试。一些参数只应用于遗传测试用例。请查看下面的描述以找到更多的细节。
- -active-connection是一个类似的参数-on-socket选项。如果设置不了关闭网络套接字,如果测试在循环中运行,每个循环运行重新使用网络连接。与在-1-套接字模式不同的是,整个测试在每次运行时执行包括XMPP流初始化和用户认证。这个选项目前不是在正常使用中推荐。它只对调试服务器行为非常有用。
- -background在后台单独执行测试,并立即返回控制到测试套件程序,而不需要等待测试完成。违约行为是要按顺序执行所有的测试,并在之前的测试完成时运行下一次测试。然而,这个参数允许同时运行测试。这有点类似于-守护进程参数。然而,守护进程的测试/任务完全被忽略了,结果来自于在后台测试是正常的测试时,守护进程不会被收集。与另一个或可能许多其他的测试同时进行。
- -daemon创建一个在不同线程中运行的任务。这样一个测试运行作为一个守护进程,它没有被记录在测试报告中,它的结果是没有计算出来的。这种测试/任务的目的是作为其他测试用例的助手。一个很好的例子这种守护进程测试是消息应答器——在不同用户名下运行的测试等待消息并响应发送者。
- -delay = 1000在测试用例完成后的几毫秒内设置等待时间。你可能如果你想在循环中运行的每个测试用例之间引入短期延迟,或者你可以使用它启动助手守护进程线程,您必须添加延迟以确保它已经准备好了在下一次真正的测试开始之前,工作开始向守护进程发送请求。
- -expect-type = error为预期为响应的数据包设置类型。一些测试用例消息发送者期望有时响应与发送数据包的相同类型(聊天)但在其他一些情况下,当它向拥有隐私列表的用户发送一条消息时消息的响应应该是错误的。这样我们就可以使用相同的测试用例测试不同的反应情况。
- -loop = 10设置测试(以及所有继承的测试)的次数。你可以使用$(loop)伪变量来获得和使用当前循环运行号。这是非常有用的如果你想运行每个循环运行一个不同的用户名比如注册10个不同的用户账户。要做到这一点,您可以将(loop)变量粘贴到用户名字符串:-user-name ="nick_name_$(loop)"
- -loop-delay = 10 在测试的每一个单独循环之间设置一个延迟。它运行了很多次。这是类似的参数 -delay,但是 -delay项在整个测试(或所有循环运行)完成后引入延迟。那循环延迟选项在每次循环测试之间增加等待时间。
- -loop-start = 5设置循环起始值。它不会影响循环的次数的方式。它只会影响$(loop)变量的值。假设你想要运行一个负载测试拥有100 k并发用户的服务器,您希望从3个不同的服务器运行测试机器。为了确保每台机器使用不同的用户帐户你必须设置不同的用户帐户-loop-start参数,以防止重叠。
- -messages = 10设置要发送到服务器的消息数量。这是另一种方法循环测试。而不是用开放网络连接来重复整个测试,XMPP流、身份验证等等,只会导致消息多次发送。这参数被一些只发送消息的测试用例所接受。的消息监听器-测试用例,它应该对这里的数字作出响应指定在测试成功之前必须发送多少次响应终止它的工作。
- -multi-thread选项导致运行测试用例,并在所有级别的测试用例中继承
单独的线程。通常情况下,你放置参数的测试用例没有测试ID(你在@和字符之间放了什么,这样它就不会自己运行测试了。相反,它包含一系列的测试用例,然后在一个单独的线程中运行。这是一个为许多并发用户运行测试的关键参数。(但不是负载测试。)为例如,当5个同步修改时,您可以看到服务器是否正确他们的名单。执行时间所有继承的测试都是在单独的线程中运行的将每个单独的测试结果一起计算并添加到总主项中测试结果。
- -multi-thread选项导致运行测试用例,并在所有级别的测试用例中继承
- -no-record用于配置测试(任务),用于准备用于后续测试的XMPP服务器或数据库。例如,可以创建测试用户在以后的名册测试中使用的帐号。通常你不希望包含这样的内容测试报告中的测试和使用这个参数基本上排除了测试报告。但是,测试和结果显示在命令行输出中,所以您仍然可以跟踪到底发生了什么。
- -on-one-socket是一个循环测试用例的修饰符。通常当我们切换循环时使用 -loop参数这个套件重新设置了状态,关闭网络套接字并运行测试从一开始,包括打开网络套接字,XMPP流,认证等等。但是这个参数改变了这种行为。网络插座没有关闭当测试运行完成(成功),下一次运行只执行最后一部分测试省略了XMPP流的初始化、认证和其他所有的。这是当您想要向服务器发送多条消息时非常有用(尽管这种效果可能是使用-消息参数也完成了)或注册了许多用户帐户服务器,不注册用户帐户和其他任何可能有意义的重复了。
- -port = 5223 这个参数类似于IP地址设置,也可以全局设置所有的测试。通常,您将它设置为选中的测试,只检查SSL连接。对于所有其他测试,使用默认端口号。因此,这些参数已经包括在本节中,而不是“基本测试参数”。
- -presence这个参数允许在之后以正优先级发送初始存在连接并绑定会话。
- -repeat-script = 100 and -repeat-wait = 10 两个参数是特定于普通测试的
情况下。(测试用例从伪xml文本文件中读取测试输入/输出数据。第一个参数是测试循环的另一个变体。它设置了测试的次数重复。它的工作原理非常类似于-on-one-socket参数。唯一的区别一般的测试可以在运行之间保留一些内部状态因此它有更多地控制数据。第二个参数以毫秒为间隔设置超时在每个单独的测试运行之间等待/延迟它与-延迟是一个非常相似的参数但是它在通用测试中设置了一个超时。
- -repeat-script = 100 and -repeat-wait = 10 两个参数是特定于普通测试的
- -source-file = "dir/path/to/file.cot是设置“通用测试”脚本文件的参数。那普通测试是一个测试用例,它依赖于身份验证测试用例,并且可以读取数据从文本文件中发送和响应期望。“cot”文件是一个伪xml文件stanzas发送和stanzas期待。测试用例比较接收到的数据包在文本文件中,并报告测试结果。这通常是一种更方便的方式编写一个新的测试用例,而不是用Java编写它们。
- -time-out-ok当我们期望套接字超时作为一个正确的结果时,将被设置为一测试用例。通常,超时意味着测试失败了,并且没有响应服务器或响应都是不正确的。然而,对于一些测试(比如发送a消息给通过隐私列表屏蔽消息的用户)超时是想要正确的测试结果。
- -to-jid = "user_name@host.name (mailto:user_name@host.name) "设置了目的地处理数据包发送数据包的地址。作为一个例子,测试用例发送<message / >消息包。您可以为数据包设置目标地址。看来,通常每测试期望对发送的数据做出一些响应,以确保目标端点将会发回测试用例所期望的数据。
参考文章:
【1】Tigase Development Guide
扫描以下公众号关注小猿↓↓↓↓↓↓↓↓
更多资讯请在简书、微博、今日头条、掘金、CSDN都可以通过搜索“Share猿”找到小猿哦!!!
网友评论