# [Nightwatch 新手紀實] test case 生命週期
> 生命週期共有 [before、after、beforeEach、afterEach](https://nightwatchjs.org/guide/#using-before-each-and-after-each-hooks) 這四個 [hook](https://whatis.techtarget.com/definition/hook) 當作生命週期的方法,命名很直覺、使用上也很直覺。
## 新手
我剛開始接觸 NightwatchJs 寫時,一個檔案寫一組生命週期,例如 **./test/xxx.js**:
```
module.exports = {
before () { // xxx.js 開始執行時
console.log('start test')
},
beforeEach(browser, done) { // 下面每個 test case 開始時
browser
.maximizeWindow()
done()
},
afterEach(browser, done) { // 下面每個 test case 結束時
done();
},
after(){ // xxx.js 結束執行時
console.log('end test')
}
'A. 測試 ooo 情境': (browser) => {
......
},
'B. 測試 ### 情境': (browser) => {
......
},
}
```
像這樣,因為還不熟,怕不同檔案的生命週期有所不同。

---
## 進步
後來發現生命週期的內容都差不多,真的可以像 [官網](https://github.com/nightwatchjs/nightwatch/blob/master/examples/globalsModule.js)、[部落客](https://github.com/cythilya/nightwatch101/blob/master/globals.js) 教的,一個專案寫一個生命週期,模組化成一個檔案 (這邊舉例命名為 **globals.js** )
先在 **nightwatch.conf.js** 關聯:
```
const config = {
...
globals_path: './test/globals.js', // 看檔案路徑放哪裡,檔案名稱可自訂
...
}
```
然後 **./test/globals.js** 檔案:
```
before () { // 當每個 xxx.js 開始執行時
console.log('start test')
},
beforeEach(browser, done) { // 子 test case 開始時
browser
.maximizeWindow()
done()
},
afterEach(browser, done) { // 子 test case 結束時
done()
},
after(){ // 當每個 xxx.js 結束執行時
console.log('end test')
}
```
之後,要寫 test case 時,就可以省略生命週期的宣告,例如剛才開頭舉例的 **./test/xxx.js** 就只剩下簡潔的:
```
module.exports = {
'A. 測試 ooo 情境': (browser) => {
......
},
'B. 測試 ### 情境': (browser) => {
......
},
}
```

---
## 待思考
* 什麼樣的情況會需要不同的生命週期?目前只想到做不同的視窗大小的測試的話(setWindowSize()),衍生思考是不是可以模組化 RWD 的測試?
* 目前主要在用 beforeEach 和 afterEach,before 和 after 只拿來用 console.log,不知道有沒有更好地利用?