我們希望發(fā)生的事件要在日志流中正確地出現(xiàn)
事務(wù)標(biāo)識符(也就是關(guān)聯(lián)ID)如預(yù)期一樣通過日志流
事件按適當(dāng)?shù)募墑e被記錄(Info、Error、Debug等)——如果我們正在使用可配置的日志級別
當(dāng)然,通過檢查這些東西,我們已經(jīng)試用了日志子系統(tǒng)和并且隱含地對它也進(jìn)行了測試。通過把日志作為一個可測試的系統(tǒng)組件,我們也往往會減少問題的“檢測時間”,增加團(tuán)隊參與,加強(qiáng)合作,提高軟件可操作性。
我們需要定義一組事件類型ID,這些事件類型ID對應(yīng)于我們的軟件中有用的和關(guān)鍵的操作或執(zhí)行點(diǎn)。到底要定義多少這樣的ID取決于你的軟件,但至少我們有ApplicationStarted和DatabaseConnectionFailed或DocumentStoreUnavailable類似的東西(當(dāng)要用到這些東西時再去定義相應(yīng)的額外的ID,不要試圖事先定義所有可能的事件)。
例如,如果我們正在用C#構(gòu)建電子商務(wù)應(yīng)用程序,我們可能會:
public enum EventID
{
// Badly-initialised logging data
NotSet = 0,
// An unrecognised event has occurred
UnexpectedError = 10000,
ApplicationStarted = 20000,
ApplicationShutdownNoticeReceived = 20001,
PageGenerationStarted = 30000,
PageGenerationCompleted = 30001,
MessageQueued = 40000,
MessagePeeked = 40001,
BasketItemAdded = 60001,
BasketItemRemoved = 60002,
CreditCardDetailsSubmitted = 70001,
// ...
}
我們使用人類可讀的名稱再加上一個唯一整數(shù)值一起作為事件ID,這樣就可以將相關(guān)或相類似事件組合在一起:在這里,所有有關(guān)“籃子”的事件類型會使用60000到69999之間的整數(shù)ID。當(dāng)我們的軟件在代碼中處理到相應(yīng)的狀態(tài)時,它會將相關(guān)的事件類型的ID與其他日志數(shù)據(jù)一起寫入日志文件中。這反過來又被日志聚合系統(tǒng)收集起來,可以提供給搜索(通過瀏覽器和一個API)使用。

如果我們想把一個關(guān)于發(fā)生在日志流中預(yù)期或意外事件的測試用例自動化,我們可以通過curl做一個簡單的API調(diào)用來進(jìn)行查詢。
例如,我們可能想檢查發(fā)生了一次數(shù)據(jù)庫查詢(預(yù)期發(fā)生事件DatabasePreQuery 和DatabasePostQuery)并且沒有出現(xiàn)連接問題(突發(fā)事件DatabaseConnectionFailed)。
這里是為DatabasePreQuery事件(你也可以 在GitHub找到 它)查詢Elasticsearch API (在本地運(yùn)行)的curl命令:
$ curl -XGET 'http://localhost:9200/_search?q=message:DatabasePreQuery&pretty'
這個查詢的結(jié)果可能是,例如(為了清晰度重新格式化過,并添加了行數(shù)以供參考):
1 {
2 "took" : 19,
3 "timed_out" : false,
4 "_shards" : {
5 "total" : 20,
6 "successful" : 20,
7 "failed" : 0
8 },
9 "hits" : {
10 "total" : 1,
11 "max_score" : 11.516103,
12 "hits" : [ {
13 "_index" : "logstash-2016.05.06",
14 "_type" : "logs",
15 "_id" : "gHEKyHasRb6GaUhM1gywpg",
16 "_score" : 11.516103,
17 "_source":{"message":
18 "[2016-05-06 17:07:42] slim-skeleton.INFO: DatabasePreQuery [] []",
19 "@version":"1",
20 "@timestamp":"2016-05-06T16:07:42.749Z",
21 "host":"vagrant-ubuntu-trusty-64",
22 "path":"/var/www/wibble/logs/app.log"}
23 } ]
24 }
24
25 }
以上的第10行表明,查詢精確地匹配上了一條日志(總命中量為1),并在第13行開始是查詢響應(yīng),實(shí)際的日志消息在第18行開始的。
那么,我們可以使用我們的選擇工具,將這些搜索結(jié)果輸入到我們的數(shù)據(jù)庫中查詢測試,以解析JSON的響應(yīng)并且確定事件是否發(fā)生了。
例如,測試用例的基本Ruby實(shí)現(xiàn)(你也可以 在GitHub上找到 它):
1 require 'json'
2
3 file = open("Database_prequery_search.json")
4 prequery = JSON.parse(file.read)
5
6 file = open("Database_postquery_search.json")
7 postquery = JSON.parse(file.read)
8
9 file = open("Database_connectionfailed_search.json")
10 connectionfailed = JSON.parse(file.read)
11
12 expected_prequery_event = (prequery["hits"]["total"] == 1)