Angular+Grunt+Bower+Karma+Protractor (Atom)
1. 配置bower
1.安装bower
npm install -g bower
2.创建.bowerrc文件
{
"directory": "src/bower"
}
3.添加依赖
bower install angular
4.创建配置文件
bower init

结果如下:
{
"name": "UnitTest",
"description": "Unit test descritpion",
"main": "",
"keywords": [
"test"
],
"authors": [
"zyx"
],
"license": "MIT",
"homepage": "http://zyxgis/homepage",
"private": true,
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"src/bower",
"test",
"tests"
],
"dependencies": {
"angular": "^1.5.8"
}
}
5.添加更多依赖
bower install --save angular-mocks
2. 配置Karma
1.安装Karma and Jasmine
npm install -g karma
npm install -g karma-cli
npm install -g jasmine
npm install -g karma-jasmine
npm install -g karma-coverage
npm install -g karma-chrome-launcher
npm install -g karma-firefox-launcher
2.创建配置文件
karma init

结果如下:
// Karma configuration
// Generated on Sun Sep 11 2016 16:01:11 GMT+0800 (中国标准时间)
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '../',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'src/bower/angular/angular.js',
'src/bower/angular-mocks/angular-mocks.js',
'src/js/**/*.js',
'test/unit/**/*.js'
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
// web server port
port: 9876,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['Chrome', 'Firefox'],
plugins : ['karma-chrome-launcher',
'karma-firefox-launcher',
'karma-jasmine'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: false,
// Concurrency level
// how many browser should be started simultaneous
concurrency: Infinity
})
}
3.创建启动karma服务的批处理文件scripts\test.bat
#!/bin/bash BASE_DIR='dirname $0' echo "" echo "Starting Karma Server (http://karma-runner.github.io)" echo "-------------------------------------------------------" karma start $BASE_DIR/../conf/karma.conf.js $*
4.创建单元测试文件
test\unit\controllers.spec.js
'use strict';
describe('controller specs', function() {
var $scope;
beforeEach(module('myApp.controllers'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
$controller('helloWorldCtrl', {
$scope: $scope
});
}));
it('should create "name" model with first name "Jane"', function() {
expect($scope.name.first).toBe("Jane");
});
});
test\unit\directives.spec.js
'use strict';
describe('specs for directives', function() {
beforeEach(module('myApp.directives'));
var $scope;
beforeEach(inject(function($rootScope) {
$scope = $rootScope.$new();
$scope.name = {
first: "John",
last: "Doe"
};
}));
describe('hello-world', function() {
it('should contain the provided name', function() {
inject(function($compile) {
var element = $compile('<div hello-world name="name"></div>')($scope);
$scope.$digest();
expect(element.html()).toContain("John");
});
});
});
});
5.执行单元测试
scripts\test.bat
3. 配置protractor
1.安装protractor
npm install -g protractor
webdriver-manager update
2.安装JDK
3.启动webdriver-manager
webdriver-manager start
4.安装http-server
npm install -g http-server
5.在工程目录(project directory)启动http-server
http-server -a localhost -p 8000
查看index.html页面的地址为:http://localhost:8000/src/
6. 创建protractor的配置文件
conf\protractor.conf.js
'use strict';
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['../test/protractor/spec.js'],
capabilities: {
browserName: 'chrome'
}
};
7. 创建集成测试文件
test\protractor\spec.js
'use strict';
describe('hello world app ', function() {
it('should have a title', function() {
browser.get('http://localhost:8000/src/');
expect(browser.getTitle()).toEqual('Hello World');
});
});
describe('name fields', function() {
it('should be filled out and editable', function() {
browser.get('http://localhost:8000/src/');
var h1 = element.all(by.css('h1')).first();
var fname = element.all(by.tagName('input')).first();
var lname = element.all(by.tagName('input')).get(1);
expect(h1.getText()).toEqual("Hello Jane Doe!");
expect(fname.getAttribute('value')).toEqual("Jane");
expect(lname.getAttribute('value')).toEqual("Doe");
fname.clear().sendKeys('John');
lname.clear().sendKeys('Smith');
expect(h1.getText()).toEqual("Hello John Smith!");
expect(fname.getAttribute('value')).toEqual("John");
expect(lname.getAttribute('value')).toEqual("Smith");
});
});
8. 执行集成测试文件
protractor conf/protractor.conf.js
4. 配置Grunt
1. 创建package.json文件
npm init

结果如下:
{
"name": "my-hello-world",
"version": "1.0.0",
"description": "auto build system",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"auto"
],
"author": "zyx",
"license": "ISC",
"dependencies": {
},
"devDependencies": {
"bower": "~1.7.9",
"grunt": "~1.0.1",
"karma-jasmine": "~1.0.2",
"karma-firefox-launcher": "~1.0.0",
"karma-chrome-launcher": "~2.0.0"
}
}
2. 添加更多依赖
npm install --save-dev grunt-contrib-concat
npm install --save-dev grunt-contrib-copy
npm install --save-dev grunt-targethtml
npm install --save-dev grunt-protractor-runner
3. 添加更多依赖
npm install
package.json
{
"name": "my-hello-world",
"version": "1.0.0",
"description": "auto build system",
"keywords": [
"auto"
],
"author": "zyx",
"license": "ISC",
"dependencies": {},
"devDependencies": {
"bower": "~1.7.9",
"grunt": "~1.0.1",
"grunt-contrib-concat": "~0.5.0",
"grunt-contrib-copy": "~0.5.0",
"grunt-karma": "^2.0.0",
"grunt-protractor-runner": "^3.2.0",
"grunt-targethtml": "~0.2.6",
"karma": "~1.3.0",
"karma-chrome-launcher": "~2.0.0",
"karma-firefox-launcher": "~1.0.0",
"karma-jasmine": "~1.0.2"
}
}
4.编写配置文件
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: ['src/bower/angular/angular.js','src/js/*.js'],
dest: 'dist/js/<%= pkg.name %>.js'
}
},
copy: {
main: {
src: 'src/css/main.css',
dest: 'dist/css/main.css',
},
},
targethtml: {
dist: {
files: {
'dist/index.html': 'src/index.html'
}
}
},
karma: {
unit: {
configFile: 'conf/karma.conf.js',
singleRun: true
}
},
protractor: {
e2e: {
options: {
configFile: 'conf/protractor.conf.js'
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-targethtml');
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-protractor-runner');
grunt.registerTask('dist', ['karma', 'protractor', 'concat', 'targethtml', 'copy']);
};
5.编写index.html文件
src\index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<link rel="stylesheet" href="css/main.css">
</head>
<body ng-app="myApp">
<div ng-controller="helloWorldCtrl">
<h1 hello-world name="name" id="greeting"></h1>
</div>
<!--(if target dev)><!-->
<script src="bower/angular/angular.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
<script src="js/directives.js"></script>
<!--<!(endif)-->
<!--(if target dist)><!-->
<script src="js/my-hello-world.js"></script>
<!--<!(endif)-->
</body>
</html>
6. 启动webdriver-manager
webdriver-manager start
7. 启动http-server
http-server -a localhost -p 8000
8.执行Grunt的构建
grunt dist
Angular+Grunt+Bower+Karma+Protractor (Atom)的更多相关文章
- 前端开发环境搭建 Grunt Bower、Requirejs 、 Angular
现在web开发的趋势是前后端分离.前端采用某些js框架,后端采用某些语言提供restful API,两者以json格式进行数据交互. 如果后端采用node.js,则前后端可以使用同一种语言,共享某些可 ...
- Grunt + Bower—前端构建利器(转)
目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...
- 前端构建利器Grunt—Bower
runt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web ...
- Grunt + Bower—前端构建利器
目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...
- Grunt Bower构建前端
Grunt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的W ...
- 用Laravel+Grunt+Bower管理你的应用
来源:http://yansu.org/2014/03/10/grunt-bower-and-laravel.html 为什么这么选择? 如今开源盛行,从后端的各个类库,到如今前端的jQuery插件, ...
- 简介Gulp, Grunt, Bower, 和 Npm 对Visual Studio的支持
[原文发表地址]Introducing Gulp, Grunt, Bower, and npm support for Visual Studio Web 开发,特别是前端 Web 开发,正迅速变得像 ...
- 在 Visual Studio 2013 中使用 Grunt, Bower 和 NPM
在 Visual Studio 2015 中提供了对于 Grunt 和 Gulp 的内置支持,在 Visual Studio 2013 中怎么办呢?微软将 2015 中的特性作为几个独立的扩展发布出来 ...
- grunt+bower依赖管理
安装bower(必须安装git) npm install bower -g bower按照插件命令 初始化配置 bower init 生成bower.json //如果有bower.json 直接输入 ...
随机推荐
- sublime text学习
Ctrl + / ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N-------------------新建 软件右下 ...
- 使用jQuery的animate方法制作滑动菜单
周末看Ziv小威的博客<制作滑动条菜单,如何延时处理滑动效果,避免动画卡顿>,参见地址:http://www.cnblogs.com/zivxiaowei/p/3462964.html.是 ...
- Linux笔记之——Linux关机命令详解(转)
原文连接:http://www.jb51.net/os/RedHat/1334.html 在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重 ...
- 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答
(原创) 今天在做下滑刷新的时候碰到 view 的四个 get 函数有点特别,具体遇到的问题如下,经反复测试和查找资料,填坑如下: 1,为什么我有时候在使用getLeft(), getRight(), ...
- SharePoint 2013 托管导航 无法被开启的解决办法
在阅读了园子中霖雨的一片博文<SharePoint 2013 托管导航及相关配置>之后,非常想尝试一下SharePoint 2013 中的这个新功能,但是我的网站集包括样式是从2010升级 ...
- ManagementClass类解析和C#如何获取硬件的相关信息
在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作. 现在先来介绍一下ManagementClass类,首先看一下类的继承 ...
- 关于从JSP页面插入数据到数据库中乱码问题的解决
问题描述:最近我在写一个j2ee的留言板系统模块,遇到了一个非常让我头大的问题,当我从JSP页面输入数据后,通过hibernate中的业务逻辑类HQL语句把这个数据插入到本地的mysql数据库中,可是 ...
- uploadify上传错误:uncaught exception: call to startUpload failed原因
这个不是什么tab的问题,而是可能有多个上传的div或者input(含有相同的name或者ID)导致的 如果有两个不同的上传按钮,那么他们的name,id要设置得不一样. <div id='to ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...