2012-04-11 76 views

回答

2

好吧,好消息是除了最上面的run-tests.py脚本之外,Asterisk Test Suite是语言不可知的。你会发现用python,lua甚至bash编写的测试。 Java将是一个新的补充。我不会推荐尝试重写runtests.py - 你不会为此付出很大的代价,尽管我想你可以这么做。就“沙箱”Asterisk的一个实例而言,它不会与其他Asterisk实例发生冲突并且您可以同时运行任何数字,您需要采取许多步骤才能使其正常工作。幸运的是,如果您查看asterisk.py模块(在lib/python/asterisk中) - 或者asttest/lib/lua中的astlib.lua,您将得到一些必须完成的工作示例发生。

至少,你需要做到以下几点:

  • 创建将承载测试中的目录结构。按照惯例,每个执行的测试都在/ tmp/asterisk-testsuite/[test_directory]下运行,其中[test_directory]可能包含多个子目录,并且反映了测试套件中该测试的位置。请注意,在测试失败的情况下,最顶级的脚本中有很多事物会预期在相对位置,所以我不会从那里移动它。
  • 在您的测试目录中创建与您要运行的Asterisk实例相对应的子文件夹。这些通常被命名为astn,其中n是该目录中的下一个可用数字。比如说,你有两个Asterisk实例在测试过程中运行。第一次运行测试时,您将创建子目录ast1和ast2。下一次; ast3和ast4。
  • 对于Asterisk的每个实例,您将生成一个asterisk.conf配置文件,该配置文件相对于前两步中提到的位置指定所有Asterisk配置目录的位置。然后,您可以将创建的asterisk.conf安装到/tmp/asterisk-testsuite/[test_directory]/ast[n]/etc/asterisk/asterisk.conf中。
  • 安装所需配置文件的其余部分。如果测试没有提供配置文件,python/lua库所做的是硬链接到主机系统检测到的配置文件;否则他们会将配置文件复制到这些目录中。
  • 硬链接到系统上安装的模块。如果每个测试都有自定义模块,则可以将它们放置在测试运行目录中。
  • 当你产生Asterisk时,你指定一个不同的配置位置,然后使用-C选项指定默认值。

举一个例子,让我们来看一下confbridge python测试。它产生了三个Asterisk实例。第一次运行时,它会熄灭,看看/ tmp/asterisk-testsuite是否存在。让我们说它不。所以我们制作该目录。

/tmp/asterisk-testsuite/ 

然后,我们看到,该测试在测试/应用/ confbridge正在运行的生活 - 所以我们让我们的测试目录,因为我们还没有运行任。

/tmp/asterisk-testsuite/apps/confbridge 

现在它变得有趣。我们之前没有运行过,所以当我们检查我们的测试目录中是否存在astn目录时,我们确定没有。所以我们创建了三个这样的目录。

/tmp/asterisk-testsuite/apps/confbridge 
             /ast1 
             /ast2 
             /ast3 

只服用AST1作为一个例子,我们创建一个包含地点,我们的路一个的asterisk.conf:

[directories](!) 
astetcdir => /tmp/asterisk-testsuite/apps/confbridge/ast1/etc/asterisk 
astmoddir => /tmp/asterisk-testsuite/apps/confbridge/ast1/usr/lib/asterisk/modules 
astvarlibdir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/lib/asterisk 
astdbdir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/lib/asterisk 
astkeydir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/lib/asterisk 
astdatadir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/lib/asterisk 
astagidir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/lib/asterisk/agi-bin 
astspooldir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/spool/asterisk 
astrundir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/run/asterisk 
astlogdir => /tmp/asterisk-testsuite/apps/confbridge/ast1/var/log/asterisk 

[options] 
verbose = 5 
debug = 5 
defaultlanguage = en   ; Default language 
documentation_language = en_US ; Set the language you want documentation 
       ; displayed in. Value is in the same format as 
       ; locale names. 
[compat] 
pbx_realtime=1.6 
res_agi=1.6 
app_set=1.6 

我们现在复制我们的asterisk.conf到我们的测试目录。

/tmp/asterisk-testsuite/apps/confbridge/ast1/etc/asterisk/asterisk.conf 

我们随后将硬连接共享对象到/ var/lib中/星号/模块子目录中的必要安装的模块,并安装的配置文件硬连接到/ etc /星号子目录。或者,对于/ var/lib/asterisk/modules,如果您愿意,我们可以让它使用标准安装的模块,而不是硬链接。

最后,当我们产卵的Asterisk,我们使用的语法如下:

asterisk -f -g -q -m -n -C /tmp/asterisk-testsuite/apps/confbridge/ast1/etc/asterisk/asterisk.conf 

补遗我上面

写这没有什么错与Java,但也有很多重的如果你决定在测试套件中使用新的语言,那么你将不得不这样做 - 而不仅仅是获取Asterisk。我们在lua/python库中写了很多其他的东西,除了我在这里描述的所有东西外,还可以让你的生活更轻松。诸如用于CDR解析和操作的常见测试类,语音邮件操作,复杂的状态机与SIPp的交互,测试是如何利用多个SIPp实例并与测试套件协同编排它们 - 我们一直专注于Python库晚了。你可能想要考虑只用Python--但是,如果你真的爱Java,那么一定要随意使用它。

+0

感谢您的回答。 python的问题是一些测试无故失败。例如:sip_attended_transfer失败,因为即使安装了所有依赖关系(pjsua,twisted,starpy和comment-“skip”on test-config.yaml),starpy也无法连接到管理器。 使用java的想法不是用来修改runtest.py,python只关心退出代码来说测试是否通过或失败,所以我能够创建一个bash脚本,在那里执行一个java连接管理器和读取事件并在检测到特定事件时返回0。 – ViROscar 2012-04-13 16:31:59

+0

与文件结构的唯一区别是“apps”文件夹,因为我使用的是“tests”文件夹(testsuite/tests)。 – ViROscar 2012-04-13 16:33:27

+0

首先,如果一个测试失败,它不是一个Python的问题。其次,如果'skip'关键字被添加到test-config.yaml文件中,则它是因为测试存在已知问题,而不是测试语言。最有可能的是测试正在做一些依赖于时序的,我们还没有解决的问题(我们知道这是特定测试的情况。第三,是的,run-tests.py脚本只关心退出代码 - 这是为什么我说测试套件是语言不可知的?最后,你可以使用任何你想要的子层次结构。我们把应用程序测试放在应用程序中,SIP在频道中等。 – 2012-04-14 02:35:02