zoukankan      html  css  js  c++  java
  • angular单元测试与自动化UI测试实践

    关于本文:介绍通过karma与jsmine框架对angular开发的应用程序进行单元与E2E测试。

    先决条件

    • nodejs
    • webstorm

    创建项目

    webstorm中创建空白web项目

    空白项目

    创建html、js文件夹

    在项目中创建2个文件夹分别用于存放项目中用到的html、js文件。

    安装框架

    安装前端框架

    项目中的前端框架主要为angularjs相关的框架,为了安装框架方便可安装bower包管理器。

    1) 安装bower包管理器

    在webstorm的terminal中执行脚本

    npm install bower -save
    

    2) 初始化bower.json文件

    执行脚本生成bower.json文件,用于管理bower的依赖和配置。

    bower init
    

    3) 安装angular等框架

    除了项目要用到的angular框架外还需要安装angular-mocks框架

    bower install bootstrap -save
    
    bower install angular -save
    
    bower install angular-mocks -save
    

    安装服务器端框架

    服务器依赖于nodejs,需要安装nodejs的包,首先在根目录下创建package.json文件。

    1)安装http-server模块

    npm install http-server -save
    

    2)安装其他模块

    • jasmine-core:javascript单元测试框架;
    • karma:模拟javascript脚本在各种浏览器执行的工具;
    • karma-chrome-launcher: 在chrome浏览器执行的工具;
    • karma-jasmine: jasmine-core在karma中的适配器;
    • karma-junit-reporter: 生成junit报告;
    • protractor:E2E测试框架

    启动服务器

    要启动node服务器需要在package.json中配置script节点,dependencies中定义依赖包,在script配置start节点用于启动服务器,test节点的内容会在后面讲解。

    "name": "angularjs-test",
      "version": "0.0.1",
      "dependencies": {
        "bower": "^1.7.7",
        "http-server": "^0.9.0",
        "jasmine-core": "^2.4.1",
        "karma": "^0.13.22",
        "karma-chrome-launcher": "^0.2.3",
        "karma-jasmine": "^0.3.8",
        "karma-junit-reporter": "^0.4.1",
        "protractor": "^3.2.1"
      },
      "scripts": {
        "postinstall": "bower install",
        "prestart": "npm install",
        "start": "http-server -a localhost -p 8000 -c-1",
        "pretest": "npm install",
        "test": "karma start karma.conf.js",
        "test-single-run": "karma start karma.conf.js  --single-run"
      }
    

    配置后运行命令,启动服务器,浏览器上输入http://localhost:8000

    npm start
    

    开始单元测试

    编写功能代码

    在文件js中新建js文件index.js。在index.js中定义congroller,实现简单累加方法add,代码如下:

    /**
     * Created by stephen on 2016/3/24.
     */
    
    (function (angular) {
        angular.module('app', []).
        controller('indexCtrl', function ($scope) {
            $scope.add = function (a, b) {
                if(a&&b)
                return Number(a) + Number(b)
                return 0;
            }
        });
    })(window.angular);
    

    在文件html中新建html文件index.html,加入两个输入框用户获取输入,当输入后绑定controller中的add方法实现计算器功能,代码如下:

    <!DOCTYPE html>
    <html lang="en" ng-app="app">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    
    </head>
    <body>
    <div ng-controller="indexCtrl">
        <input type="text" ng-model="a" value="0">
        +
        <input type="text" ng-model="b" value="0">
        =<span id='result'>{{add(a,b)}}</span>
    </div>
    </body>
    </html>
    <script src="/bower_components/angular/angular.min.js"></script>
    <script src="/bower_components/angular-mocks/angular-mocks.js"></script>
    <script src="/js/index.js"></script>
    

    启动服务器看到下图效果

    效果

    编写测试代码

    在test文件夹中新建文件index-test.js用于编写index.js的单元测试。

    'use strict';
    describe('app', function () {
        beforeEach(module('app'));
        describe('indexCtrl', function () {
            it('add 测试', inject(function ($controller) {
                var $scope = {};
                //spec body
                var indexCtrl = $controller('indexCtrl', {$scope: $scope});
                expect(indexCtrl).toBeDefined();
                expect($scope.add(2, 3)).toEqual(5);
            }));
    
        });
    });
    

    单元测试配置

    初始化karma配置文件,用于配置karma,执行命令

    karma init
    

    在karma配置文件代码中每个节点都有默认注释请参看

    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: [
                'bower_components/angular/angular.min.js',
                'bower_components/angular-mocks/angular-mocks.js',
                'js/index.js',
                'test/index-test.js'
            ],
    
            // 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'],
    
    
            // Continuous Integration mode
            // if true, Karma captures browsers, runs the tests and exits
            singleRun: false,
    
            plugins: [
                'karma-chrome-launcher',
                'karma-jasmine',
                'karma-junit-reporter'
            ],
    
            junitReporter: {
                outputFile: '/test_out/unit.xml',
                suite: 'unit'
            }
        })
    }
    

    在package.json scripts 配置测试信息,指定karma文件地址

    "test": "karma start karma.conf.js",
    

    运行单元测试

    运行命令,执行测试

    npm test
    

    运行结果如下,可以看到通过测试:

    测试运行结果

    调试单元测试

    除了运行测试外,很多时候需要调试测试,在karma弹出网页中点击debug,进入http://localhost:9876/debug.html页面,就可以用chrome自带的调试工具调试代码了:

    debug点击

    debug code

    单元测试覆盖率

    如果需要对单元测试覆盖率进行统计,可以安装karma-coverage并配置karma文件。这样在单元测试完成后,会生成测试覆盖率报告文档。

    npm install karma-coverage -save
    

    在karma.conf.js文件中加入节点

    
    // 新增节点用于配置输出文件夹
    coverageReporter: {
               type: 'html',
               dir: 'coverage'
           },
    // 新增节点用于配置需要测试的文件地址(这里是controller地址)
    preprocessors: {'js/*.js': ['coverage']}
    
    // 新增元素'karma-coverage'
    plugins: [
              'karma-chrome-launcher',
              'karma-jasmine',
              'karma-junit-reporter',
              'karma-coverage',
          ],
    // 新增元素 coverage
    reporters: ['progress', 'coverage'],
    

    运行单元测试后在目录中生成coverage文件夹,点击index.html可以查看测试覆盖率。

    测试覆盖率

    E2E测试

    e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样。简而言之,它从一个用户的角度出发,认为整个系统都是一个黑箱,只有UI会暴露给用户。

    配置E2E测试

    新建文件夹e2e-test新建protractor.conf.js文件,用于配置protractor框架,代码如下。

    exports.config = {
    
        allScriptsTimeout: 11000,
    
        baseUrl: 'http://localhost:8000/app/',
    
        // Capabilities to be passed to the webdriver instance.
        capabilities: {
            'browserName': 'chrome'
        },
    
        framework: 'jasmine',
    
        // Spec patterns are relative to the configuration file location passed
        // to protractor (in this example conf.js).
        // They may include glob patterns.
        specs: ['*.js'],
    
        // Options to be passed to Jasmine-node.
        jasmineNodeOpts: {
            showColors: true, // Use colors in the command line report.
        },
    
        defaultTimeoutInterval: 30000
    };
    

    配置package.json scripts脚本节点

    "preupdate-webdriver": "npm install",
    "update-webdriver": "webdriver-manager update",
    "preprotractor": "npm run update-webdriver",
    "protractor": "protractor e2e-test/protractor.conf.js"
    

    编写e2e测试脚本

    设计测试用例:文本框a的值录入1,文本框b录入2,期望结果3

    describe('index.html', function() {
    
        beforeEach(function() {
            browser.get('http://localhost:8000/html');
        });
    
        it('get index html', function() {
    
            var a = element(by.model('a'));
            var b = element(by.model('b'));
            a.sendKeys(1);
            b.sendKeys(2);
            var result = element(by.id('result'));
            expect(result.getText()).toEqual('3');
        });
    });
    

    执行测试查看测试结果

    需要执行命名,查看是否更新webdriver(什么是webdriver http://sentsin.com/web/658.html),
    手动安装protractor至全局
    npm i -g protractor

    注:安装或更新webdriver需要翻墙,请在webstrom中设置代理地址
    webstrom中切换至Terminal窗口,在Terminal窗口通过以下方式设置代理:

    set PROXY=http://localhost:1080
    set HTTP_PROXY=%PROXY%
    set HTTPS_PROXY=%PROXY%
    

    代理设置成功后,运行以下命令

    npm run update-webdriver
    

    执行e2e测试,这是会弹出浏览器,自动点击浏览器,录入脚本输入完成自动化e2e测试,其本质还是调用selenium测试。

    npm run protractor
    

    自动化ui测试结果


    参考资料

    [1] 官方测试demo https://github.com/angular/angular-seed

    [2] protractor 官方文档 http://angular.github.io/protractor/#/tutorial

    [3] 自动化E2E测试 http://sentsin.com/web/658.html

    [4] karma官方文档 https://karma-runner.github.io/latest/intro/configuration.html

    [5] angular单元测试官方文档 https://docs.angularjs.org/guide/unit-testing

    源码地址 https://github.com/stephen-v/angular-e2etest-showcase

  • 相关阅读:
    AJAX MANAGER
    关闭IE浏览器的自动RSS阅读功能
    WCF REST Configuration for ASP.NET AJAX and plain REST Services
    jquery, json与ashx的完美结合
    ASP.NET 页面中的 ValidateRequest属性
    ASP.NET中的healthMonitoring
    GZip Compress SoapExtension
    ASP.NET MVC : UrlHelper
    Microsoft Ajax Content Delivery Network
    ASP.NET: TextBox控件如果设置为ReadOnly则PostBack之后可能丢失数据的问题
  • 原文地址:https://www.cnblogs.com/vipyoumay/p/5331787.html
Copyright © 2011-2022 走看看