为什么要进行日志测试和如何进行日志测试

  我们希望发生的事件要在日志流中正确地出现

  事务标识符(也就是关联ID)如预期一样通过日志流

  事件按适当的级别被记录(Info、Error、Debug等)——如果我们正在使用可配置的日志级别

  当然,通过检查这些东西,我们已经试用了日志子系统和并且隐含地对它也进行了测试。通过把日志作为一个可测试的系统组件,我们也往往会减少问题的“检测时间”,增加团队参与,加强合作,提高软件可操作性。

  我们需要定义一组事件类型ID,这些事件类型ID对应于我们的软件中有用的和关键的操作或执行点。到底要定义多少这样的ID取决于你的软件,但至少我们有ApplicationStarted和DatabaseConnectionFailed或DocumentStoreUnavailable类似的东西(当要用到这些东西时再去定义相应的额外的ID,不要试图事先定义所有可能的事件)。

  例如,如果我们正在用C#构建电子商务应用程序,我们可能会:

  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,

  // ...

  }

  我们使用人类可读的名称再加上一个唯一整数值一起作为事件ID,这样就可以将相关或相类似事件组合在一起:在这里,所有有关“篮子”的事件类型会使用60000到69999之间的整数ID。当我们的软件在代码中处理到相应的状态时,它会将相关的事件类型的ID与其他日志数据一起写入日志文件中。这反过来又被日志聚合系统收集起来,可以提供给搜索(通过浏览器和一个API)使用。

  如果我们想把一个关于发生在日志流中预期或意外事件的测试用例自动化,我们可以通过curl做一个简单的API调用来进行查询。

  例如,我们可能想检查发生了一次数据库查询(预期发生事件DatabasePreQuery 和DatabasePostQuery)并且没有出现连接问题(突发事件DatabaseConnectionFailed)。

  这里是为DatabasePreQuery事件(你也可以 在GitHub找到 它)查询Elasticsearch API (在本地运行)的curl命令:

  $ curl -XGET 'http://localhost:9200/_search?q=message:DatabasePreQuery&pretty'

  这个查询的结果可能是,例如(为了清晰度重新格式化过,并添加了行数以供参考):

  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行开始是查询响应,实际的日志消息在第18行开始的。

  那么,我们可以使用我们的选择工具,将这些搜索结果输入到我们的数据库中查询测试,以解析JSON的响应并且确定事件是否发生了。

  例如,测试用例的基本Ruby实现(你也可以 在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)