需求:
淘宝的Tengine服务器在1.0.1版本的时候对Include指令进行了增强:
Syntax: include file | *
Default: no
使用此指令,可以包含任何你想要包含的配置文件,当配置文件include多个文件时按照字母或数字顺序进行包含。
如何通过功能/黑盒测试来验证include指令对多个文件是否确实按照字母或数字的顺序进行包含,成为需要解决的问题。
解决方案:(在此列举3个我个人整理的解决方法)
1. 比较笨的方法:在Tengine源码的main函数内添加检查语句,根据返回值的情况来判断include指令对多个文件的包含顺序;
2. 比较麻烦的方法:在Tengine编译的时候,加入第三方模块:ECHO模块。将ECHO模块的输出指令分别写入到不同的文件中,然后在配置文件中的相应的location内通过inlude指令对那些文件进行包含。
通过对Tengine的请求访问,验证返回的响应头内ECHO模块所输出的信息的顺序,以此来判断include指令对多个文件的包含顺序是否正确;
3. 比较容易的方法(这也是我所采用的测试方法):
首先需要了解Tengine(Nginx)的location匹配规则,在此仅介绍与本次相关的location正则匹配的规则,如需详细了解可参见Nginx官网wiki。
匹配规则是:按照正则location在配置文件中的物理顺序(编辑顺序)匹配的,并且只要匹配到一条正则location,就不再考虑后面的。
因此,我们可以利用Nginx location正则匹配的这个特点来进行测试。
案例一:
当配置文件内的location配置如下时:
location ~ /er.* { error_page 404 /404_1.html; } location ~ /err.* { error_page 404 /404_2.html; }
访问url: http://serverip:port/error/pageNotExit;
返回: 404_1.html页面;
访问url: http://serverip:port/eroor/pageNotExit;
返回: 404_1.html页面;
案例二:
当配置文件内的location配置如下时:
location ~ /err.* { error_page 404 /404_2.html; } location ~ /er.* { error_page 404 /404_1.html; }
访问url: http://serverip:port/error/pageNotExit;
返回: 404_2.html页面;
访问url: http://serverip:port/eroor/pageNotExit;
返回: 404_1.html页面;
因此,我们只需要在将这两个location配置写如不同的文件中:
error_page 404 /404_2.html;
}
error_page 404 /404_2.html;
}
然后在Tengine(Nginx)测试的配置文件中设置include指令:
server { listen 8099; server_name localhost; include location/*.conf; }
那么通过设计特定的url访问并检查返回结果就可以测试include指令对多个文件的包含顺序了。
ok, Nginx include指令的测试介绍完毕, 欢迎拍砖。转发请备注转自:100continue.iteye.com。 谢谢。