1.0.1 • Published 10 years ago

web-hammer v1.0.1

Weekly downloads
9
License
-
Repository
-
Last release
10 years ago

WebHammer

-c CONFIG, --config CONFIG
                        Config file path for luantai.
-f FILE, --file FILE  The javascript file which you want to test. Multi 
                      file splited by ','.
-p PLUGINS, --plugins PLUGINS
                      Luantai plugin. Multi file splited by ','.
-e ENV, --env ENV     Enviroment prepare file. Multi file splited by ','.
-r RULE, --rule RULE  Rule for filter test files. Only RegExp accepted!

执行解析

  • 栾台分为两个进程, 一个stage进程, 一个phantom进程.

  • stage进程处理参数信息以及加载和运行插件, phantom进程执行所有的前端单元测试逻辑.

  • phantom 进程在初始化完毕之后会打开一个空白的tab页面, 提供单元测试的环境.

  • 所有在phantom中执行的文件通过scriptloade机制加载进入phantom, 具体在插件部分有解释.

  • phantom执行结束后, 将所有测试信息返回stage进程, stage进程处理后输出给用户.

config 配置文件

config是一个json文件, 配置单元测试信息. 假如同时使用-c参数和其他参数(例如:-f), 以-c参数指定的配置文件为准, 其他参数会被忽略.

{	
	// file, 一个数组, 里面可以是单个文件, 也可以是一个文件夹
	"file" : [
		// 一个单一的测试文件
		'/home/admin/test-project/test/test-luantai.js',
		// 一个测试文件夹, 会对里面所有的文件跑mocha, 可以配合"rule"参数使用。
		'/home/admin/test-project/test2',
	],
	// rule, 一个字符串, 用于过滤"file"中的文件, 只有符合正则的文件, 才会被mocha运行.
	// 目前仅接受正则.
	"rule" : "test.*",
	// 目前插件执行顺序已经加载顺序都和数组的顺序相同, 具体插件的使用请参考下面插件的详细信息.
	"plugins" : [
		{
			// 这个json的key, 是插件的名字, 目前插件可以在三个位置:
			// 1. 栾台内置插件, 直接使用名字即可.
			// 2. node_modules 里面的插件, 也可以直接使用名字.
			// 3. 用户自定义插件, 需要填写插件的绝对路径, e.g: {
			//       "/home/admin/test/test-plugin.coffee" : {}
			//    }
			"cube" : {
				// 资源文件目录, 默认程序执行路径下的"./res"文件夹. 可以是绝对路径, 也可以是
				// 相对路径, 相对于当前程序执行路径.
				"resDir"  : "./res",
				// 资源文件目录, 默认程序执行路径下的"./tests"文件夹. 可以是绝对路径, 也可以是
				// 相对路径, 相对于当前程序执行路径.
				"testDir" : "./test"
				// cube 的urlbase参数, 默认: "/"
				"urlBase" : "/"
			}
		}
		{
			"istanbul" : {}
		}
	],
	// 环境准备文件, 假如测试需要很多类库, 例如: jquery, ext等, 可以在这里加载进去, 在
	// 开始跑具体的单元测试之前, 这些文件都会保证加载完毕.
	// 执行逻辑和"file"参数一样, 可以是单个文件, 也可以是一个文件夹, 但是不受"rule"参数作用.
	"env" : [
		
	]
}

命令行参数解析

  • -f 同"file"参数, 多个文件之间用,分隔, 可以是单个文件, 也可以是文件夹

  • -p 同"plugins"参数, 多个插件之间用,分隔, 但是无法设定具体的参数. e.g: -p cube,istanbul

  • -r 同"rule"参数, 只能用正则. e.g: -r 'test.*'

  • -e 同"env"参数, 逻辑和-f参数相同, 不受-r参数影响.

luantai 插件机制

栾台本身作为一个提供跑单元测试的容器, 其功能仅仅只是把单元测试跑完, 并给出结果, 所以, 其他的一些功能都通过插件实现, 例如覆盖率。 栾台提供了丰富的接口供插件使用, 具体使用方法如下:

这是一个具体的插件文件:

class TestPlugin
	
	// options 参数的值是在config文件中设置的, 例如config文件如下:
   // {
   //   plugins : [
   //       {
   //           cube : {
   //               test : 'abcd'
   //           }
   //       }
   //   ]
   // }
   // 那么, 这里options的值就是 
   // {
   //   test : 'abcd'
   // }}
   // done参数, contructor 函数可以是一个异步的方法.
	constructor : ( options, done ) ->
	
	// 当luantai server在挂载中间件之前时会执行的方法.
	// app参数是一个connect实例, 你可以挂载自己的中间件执行逻辑.
	// done 可以是一个异步方法.
	beforeMountMiddleware : ( app, done ) ->

	// 当luantai server在将所有的中间件挂载结束之后会执行的方法.
	// app参数是一个connect实例, 你可以挂载自己的中间件执行逻辑.
	// done 可以是一个异步方法.	
	afterMountMiddleware : ( app, done ) ->
	
	// 所有在phantom中执行的测试都通过scriptloader机制加载进入phantom.
	// 具体参见后面的详细解释
	scriptLoader : ( done ) ->
		done null, ( file, done ) ->
		    done null, """
		    Cube.init( {
		        base : \"#{urlBase}\",
		        enableCss : true
		      } );
		      Cube.use( \"/__test__#{file}\", function() {
		        window.callPhantom( 'luantai.scriptload.done' );
		      } );
		    """
	
	// 插件将自己所需要的前端JS文件注入到phantom中去.
	injectJs : ( done ) ->
		done null, [
		    '/home/admin/test/test.js',
		    '/home/admin/test/test2.js',
		]
	
	// feedback反馈机制, 将phantom进程具体window对象下面的某一个属性返回.
	feedback : ( done ) ->
		done null, [ 'test1', test2 ]

// 暴露一个类
module.exports = TestPlugin

scriptloader

scriptloader可以让插件选择自己应该以何种方式加载进入phantom, 默认情况下, luantai会将测试文件, 也就是"file"参数中指定的文件读入内存, 然后发送给phantom进程, 通过new Function的方式将代码文本进行执行。

fs.readFile file, ( err, data ) ->
	unless err
	  data = """
	  #{data}
	  ;window.callPhantom( 'luantai.scriptload.done' );
	  """
	  done null, data

这是默认的script loader, 通过读文件的方式, 将测试文件读入内存, 然后执行完成后, 需要调用 window.callPhantom( 'luantai.scriptload.done' );方法,表明文件已经加载完毕, 可以开始加载下一个文件啦.