2012-04-11 104 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