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)的更多相关文章

  1. 前端开发环境搭建 Grunt Bower、Requirejs 、 Angular

    现在web开发的趋势是前后端分离.前端采用某些js框架,后端采用某些语言提供restful API,两者以json格式进行数据交互. 如果后端采用node.js,则前后端可以使用同一种语言,共享某些可 ...

  2. Grunt + Bower—前端构建利器(转)

    目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...

  3. 前端构建利器Grunt—Bower

    runt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web ...

  4. Grunt + Bower—前端构建利器

    目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...

  5. Grunt Bower构建前端

    Grunt + Bower—前端构建利器   目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的W ...

  6. 用Laravel+Grunt+Bower管理你的应用

    来源:http://yansu.org/2014/03/10/grunt-bower-and-laravel.html 为什么这么选择? 如今开源盛行,从后端的各个类库,到如今前端的jQuery插件, ...

  7. 简介Gulp, Grunt, Bower, 和 Npm 对Visual Studio的支持

    [原文发表地址]Introducing Gulp, Grunt, Bower, and npm support for Visual Studio Web 开发,特别是前端 Web 开发,正迅速变得像 ...

  8. 在 Visual Studio 2013 中使用 Grunt, Bower 和 NPM

    在 Visual Studio 2015 中提供了对于 Grunt 和 Gulp 的内置支持,在 Visual Studio 2013 中怎么办呢?微软将 2015 中的特性作为几个独立的扩展发布出来 ...

  9. grunt+bower依赖管理

    安装bower(必须安装git) npm install bower -g bower按照插件命令 初始化配置 bower init 生成bower.json //如果有bower.json 直接输入 ...

随机推荐

  1. sublime text学习

    Ctrl + /  ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N-------------------新建 软件右下 ...

  2. 使用jQuery的animate方法制作滑动菜单

    周末看Ziv小威的博客<制作滑动条菜单,如何延时处理滑动效果,避免动画卡顿>,参见地址:http://www.cnblogs.com/zivxiaowei/p/3462964.html.是 ...

  3. Linux笔记之——Linux关机命令详解(转)

    原文连接:http://www.jb51.net/os/RedHat/1334.html 在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重 ...

  4. 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答

    (原创) 今天在做下滑刷新的时候碰到 view 的四个 get 函数有点特别,具体遇到的问题如下,经反复测试和查找资料,填坑如下: 1,为什么我有时候在使用getLeft(), getRight(), ...

  5. SharePoint 2013 托管导航 无法被开启的解决办法

    在阅读了园子中霖雨的一片博文<SharePoint 2013 托管导航及相关配置>之后,非常想尝试一下SharePoint 2013 中的这个新功能,但是我的网站集包括样式是从2010升级 ...

  6. ManagementClass类解析和C#如何获取硬件的相关信息

    在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作. 现在先来介绍一下ManagementClass类,首先看一下类的继承 ...

  7. 关于从JSP页面插入数据到数据库中乱码问题的解决

    问题描述:最近我在写一个j2ee的留言板系统模块,遇到了一个非常让我头大的问题,当我从JSP页面输入数据后,通过hibernate中的业务逻辑类HQL语句把这个数据插入到本地的mysql数据库中,可是 ...

  8. uploadify上传错误:uncaught exception: call to startUpload failed原因

    这个不是什么tab的问题,而是可能有多个上传的div或者input(含有相同的name或者ID)导致的 如果有两个不同的上传按钮,那么他们的name,id要设置得不一样. <div id='to ...

  9. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  10. 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹

    简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...