Karma是什么:
下面是Karma官網的描述:
The main goal for Karma is to bring a productive testing environment to developers. The environment being one where they don't have to set up loads of configurations, but rather a place where developers can just write the code and get instant feedback from their tests. Because getting quick feedback is what makes you productive and creative.
簡單來說,Karma就是一個用於運行端到端的測試環境,Karma可以用來運行Jasmine寫的單元測試和AngularJS提供的Angular_scenario寫的端到端測試。
Karma的優勢:
- Concordion搭配Selenium:
在以前的項目中都是使用的Concordion搭配Selenium做的端到端的測試,這種搭配好處在於描述性很強,Concordion寫出來的測試就是一本活的用戶文檔和需求文檔。
不好的地方也很明顯,要求測試人員的開發能力,從零開始到第一個測試運行起來,這種方法需要很大的花費來配置環境以及搭建測試框架。這種模式是分層的,最下面是Page Object,每個頁面的方法, 中間的是Test class,最上面的是UI描述,下面兩層都是需要使用到Selenium,Selenium才能提供web driver去操作瀏覽器,Concordion是html語法的,所以能夠有很多表現樣式在測試中,因此能帶來質量很高的測試描述性,Concordion的測試可以作為需求和用戶文檔的所在。
使用Concordion和Selenium搭配需要更多的花費來配置好端到端的測試環境和框架。我認為選用哪種方式做端到端的測試是可以衡量的項目需要的。
更多的關於Concordion和Selenium搭配的端到端測試請參考官網。
- Karma搭配AngularJS:
Karma配置簡單,對於前端是使用AngularJS的項目來說尤其如此,因為大多數的依賴都已經在項目中了。其他的web項目也可以使用Karma來做測試,需要額外引入AngularJS的一些文件,使用Karma做測試的優勢是顯而易見的。
- 運行方便:一條命令即可以運行測試,且Karma有Maven插件和Gradle插件,可以方便地與其他的構建工具集成。
- 調試方便:支持快速寫好測試,立即檢驗,還可以對測試進行調試,反饋周期短,能更快地定位出問題所在。
- 花費少:使用Karma運行完所有測試,花費的時間少,如果使用PhantomJS運行測試,時間會更短。由於Angular-scenario的語法很簡單,學習花費就不高,並且不需要寫很多代碼就可以運行了,寫測試的時間花費就少。
Karma的環境配置(在Windows和Mac下都試驗過):
方式一:
- 安裝NodeJS,直接去官網<http://nodejs.org/ >下載最新的安裝包進行安裝。
- 安裝Karma,使用nodeJS提供的npm(node package manager)來安裝。在命令行下(其中的-g是指全局安裝,karma-ng-scenario是運行端到端測試所需的插件):
-
npm install -g karma
npm install -g karma-ng-scenario
- 安裝PhantomJS,有兩種方式:
- 使用npm來安裝:
npm install -g phantomjs
- 從官網上下載最新的安裝包自行安裝。地址是http://phantomjs.org/ 。
方式二:
- 拷貝上面已經安裝好的那些文件從別的機器上面,放在一個目錄下,例如c:dev/software/node
- 然后將該目錄加入系統環境變量的path中,放在最前面比較好。
- 運行karma命令在命令行中,檢驗配置是否正確。
方式三:
同樣將已經安裝好的文件拷貝出來,放到項目的目錄中,在講運行karma的時候可以講到怎么將這些文件配置進去。
如何用Karma做端到端的測試:
- 需要一個配置文件,用於配置karma怎么運行測試:
- unit測試的配置文件,我一般命名為:karma.unit.config.js放在config目錄下,其中files配置的是測試代碼放的位置
module.exports = function(config) { config.set({ basePath : '', frameworks : ['jasmine'], files:[ '/unit/*.spec.js' ], port : 9876, browsers : ["PhantomJS"], singleRun : true, reporters : ["progress"], plugins : [ 'karma-jasmine' 'karma-chrome-launcher', ], }); };
- 端到端測試的配置文件,我一般命名為:karma.e2e.config.js同樣放在config目錄下,其中files配置的是測試代碼放的位置
module.exports = function(config) { config.set({ basePath : '/', frameworks : ['ng-scenario'], files:[ 'e2e/*.spec.js' ], proxies: { '/' : 'http://localhost:8080/' }, port : 9876, browsers : ["Chrome"], singleRun : true, reporters : ["progress"], plugins : [ 'karma-ng-scenario', 'karma-phantomjs-launcher', ], }); };
如果運行karma時發現問題時,可以參考更多配置文件的屬性官網介紹。畢竟每個人的項目結構也不一樣。
- 運行測試,項目目錄下在命令行下運行如下命令(unit測試也是一樣的,只是更改下配置文件就行):
karma start config/karma.e2e.config.js
- 如何寫端到端的測試請參考AngularJS E2E Testing有詳細的介紹,非常簡單就可以構建好自己的單元和端到端測試。
Karma與Maven的集成:
- 在pom.xml文件中配置karma插件,很多情況下,因為我們要在遠程服務器上面運行我們的所有測試,或者因為不想其他組員都去本機配置一下karma的環境,往往將karma的文件放在項目代碼中,workingDirectory就是指定karma文件所在位置的,在我的項目中,我將karma等文件直接放在lib目錄下面的。
<build> <plugins> <plugin> <groupId>com.kelveden</groupId> <artifactId>maven-karma-plugin</artifactId> <version>1.5</version> <executions> <execution> <goals> <goal>start</goal> </goals> <configuration> <workingDirectory>${basedir}/lib</workingDirectory> <configFile>config/karma.e2e.config.js</configFile> </configuration> </execution> </executions> </plugin> </plugins> </build>
- 怎樣將js的單元測試也加入karma,配置如下:
<build> <plugins> <plugin> <groupId>com.kelveden</groupId> <artifactId>maven-karma-plugin</artifactId> <version>1.5</version> <executions> <execution> <goals> <goal>start</goal> </goals> <configuration> <workingDirectory>${basedir}/lib</workingDirectory> <configFile>config/karma.unit.config.js</configFile> </configuration> </execution> <execution> <goals> <goal>start</goal> </goals> <configuration> <workingDirectory>${basedir}/lib</workingDirectory> <configFile>config/karma.e2e.config.js</configFile> </configuration> </execution> </executions> </plugin> </plugins> </build>
- 如果在lib目錄下除了karma的文件夾外,還有一些批處理文件的話,例如karma.cmd以及karma文件,也可以將上面配置中的如下行:
<workingDirectory>${basedir}/lib</workingDirectory>
替換為(使用Windows的cmd.exe運行mvn clean install時):
<karmaExecutable>${basedir}/lib/karma.cmd</karmaExecutable>
或者替換為(使用Windows的powershell或者其他平台運行mvn clean install時):
<karmaExecutable>${basedir}/lib/karma</karmaExecutable>
-
請注意大多數情況下,在運行karma前需要啟動服務器哦~將web項目運行起來,對於server的啟動和停止的配置就不贅述了。
- 有了上面的配置,那么可以使用Maven去運行測試了
mvn clean install
有什么可以提高的部分:
從上面的配置可以看出使用karma來構建我們的測試是很方便,容易,快捷的,優勢顯而易見,測試的語法也很簡單,非常容易上手,與后台代碼是完全解耦和的。但是和Concordion比起來,測試代碼的描述性並不強,還有就是往往容易忘記更新測試的描述在改了測試的意圖后。希望在寫測試的時候,也多考慮下測試的描述語句,希望能彌補下這點不足。
示例代碼,放在Github:Karma-Test
更多的單元測試的資料:AngularJS Unit Test