2014-04-09 20 views
7

Tôi hiện đang chơi xung quanh với các thử nghiệm E2E một Thước đo góc trong ứng dụng AngularJS và Grunt của tôi. Tôi làm theo các cài đặt từ https://www.npmjs.org/package/grunt-protractor-runner, và tôi có 2 câu hỏi:AngulrJS + Grunt + Thước đo: keepAlive và xem

Đầu tiên:

tôi đã tự hỏi, nếu có thể, để có hành vi từ đơn vị xét nghiệm của tôi với Karma:

  • bắt đầu máy chủ thử nghiệm
  • chạy tất cả các thử nghiệm
  • khi tệp thử nghiệm hoặc bất kỳ thay đổi tệp html/js nào khác, chạy lại tất cả các thử nghiệm

Tôi thích cách đó với đồng hồ trực tiếp và tự động tải lại rất nhiều, bởi vì nó làm giảm thời gian khởi động từ toàn bộ bộ và làm mọi thứ nhanh hơn.

Nhưng với thước đo góc, tôi có vấn đề: Mỗi khi tôi bắt đầu thử nghiệm với Grunt, các kiểm tra được thực hiện, và sau đó mọi thứ tắt. Mặc dù, tôi đặt tùy chọn keepAlive thành true trong phần cấu hình thước đo của Gruntfile.js. Bất kỳ ý tưởng?

Thứ hai:

tôi không thể có được nó để làm việc, để kết nối thước đo để ứng dụng góc của tôi. Tôi có phải khởi động máy chủ grunt, để phục vụ các tập tin không? Khi tôi cố truy cập một trang trong các thử nghiệm của tôi như browser.get('app/index.html'); hoặc browser.get('#/');, tôi không thể truy cập trang. Tôi đã chơi xung quanh với tùy chọn baseUrl (như baseUrl: 'http://localhost:' + (process.env.HTTP_PORT || '8000')) từ số protractor.conf.js của tôi. Nhưng với tôi có vẻ như, tôi phải bắt đầu máy chủ grunt trước đây, tôi có đúng không? Và làm thế nào tôi có thể làm điều này? Hoặc có bất kỳ tùy chọn nào khác để truy cập ứng dụng góc của tôi không? Tôi đang sử dụng sass với la bàn, vì vậy tôi nghĩ rằng, tôi cần số tiền tống tiền compass:dist.

UPDATE:

Tôi tìm thấy một workaround. Tôi đã đăng ký nhiệm vụ grunt sau:

grunt.registerTask('e2e', [ 
    'clean:server', 
    'concurrent:test', 
    'autoprefixer', 
    'connect:test', 
    'concurrent:server', 
    'autoprefixer', 
    'protractor', 
    'watch' 
    ]); 

Khi bắt đầu với grunt e2e máy chủ của tôi được bắt đầu, dựa trên baseUrl: 'http://10.0.0.200:9001' bên protractor.conf.js của tôi, và các bài kiểm tra của tôi đang chạy. Khi các bài kiểm tra được hoàn thành, các đồng hồ nhiệm vụ watch cho các tệp đã thay đổi và chạy lại thước đo góc nếu cần.

Hạn chế của việc này là, mọi lúc watch bắt đầu nhiệm vụ protractor, một phiên bản Chrome mới được sinh ra và sau khi thử nghiệm bị giết. Có cách nào để ngăn chặn thước đo góc khỏi việc giết chết phiên bản Chrome không?

Hơn nữa, tôi đã tự hỏi tại sao trong mọi hướng dẫn, nó luôn luôn nói sth như "Chỉ cần chạy grunt protractor và các thử nghiệm của bạn được thực thi ...". Tại sao tôi cần một nhiệm vụ bổ sung để khởi động máy chủ grunt của tôi để truy cập ứng dụng angularjs của tôi?

Và đây là file cấu hình của tôi:

protractor.conf.js

exports.config = { 
    capabilities: { 
    'browserName': 'chrome' 
    }, 
    chromeOnly: true, 
    specs: ['test/e2e/**/*.js'], 

    jasmineNodeOpts: { 
    showColors: true 
    }, 
    framework: 'jasmine' 
}; 

Gruntfile.js

module.exports = function(grunt) { 

    // Load grunt tasks automatically 
    require('load-grunt-tasks')(grunt); 
    grunt.loadNpmTasks('grunt-protractor-runner'); 

    grunt.initConfig({ 
    // ... 
    protractor: { 
     options: { 
     configFile: "protractor.conf.js", 
     keepAlive: false, 
     noColor: false 
     }, 
     run: {} 
    }, 
    // ... 
    }); 

    // ... 

    grunt.registerTask('test:e2e', [ 
    'clean:server', 
    'compass:dist', 
    'compass:server', 
    'autoprefixer', 
    'connect:test', 
    'protractor' 
    ]); 

    // ... 
} 

cảm ơn!

+0

Tại sao một phiếu giảm giá? Vui lòng giải thích một chút – 23tux

+1

Một downvote khác, bạn có thể giải thích những gì là sai với câu hỏi của tôi để giúp cải thiện nó? – 23tux

Trả lời

4

tôi đã tự hỏi, nếu có thể, để có hành vi từ đơn vị xét nghiệm của tôi với Karma:

Thông thường, bạn sẽ không chạy thử nghiệm E2E sau mỗi lần thay đổi HTML. Lý do chính cho việc này là chạy thử nghiệm E2E có thể mất nhiều thời gian khi bạn thêm nhiều thử nghiệm hơn. Do đó để trả lời câu hỏi, tôi không tin rằng có bất kỳ cách nào được xây dựng để hỗ trợ chạy thử nghiệm E2E sau mỗi thay đổi trong cùng một trình duyệt. Tôi khuyên bạn nên sử dụng Kiểm tra Đơn vị làm cơ chế để kiểm tra sau mỗi lần thay đổi và chạy các bài kiểm tra E2E của bạn theo cách thủ công.

Tôi có phải khởi động máy chủ grunt để phân phát tệp không?

Có, bạn cần khởi động máy chủ để chạy thử nghiệm thước đo góc. Bạn không bắt đầu một "máy chủ grunt", bạn đang thực sự bắt đầu một máy chủ web mà Selenium sẽ sử dụng đó là động cơ thước đo sử dụng cho các bài kiểm tra của nó. Đây là một trong những yếu tố phân biệt chính (trong số những yếu tố khác) giữa việc sử dụng thước đo góc và kịch bản ng.

Có cách nào để ngăn chặn thước đo góc khỏi việc giết phiên bản Chrome không?

Một lần nữa, tôi không tin rằng thước đo được sử dụng như thế này vì bạn không cần chạy thử nghiệm E2E sau mỗi lần thay đổi. Tuy nhiên, để trả lời câu hỏi, tôi không tin như vậy.

Tại sao tôi cần thêm tác vụ để khởi động máy chủ grunt của mình để truy cập ứng dụng angularjs của mình?

Câu trả lời tương tự như trên liên quan đến Selenium.

+0

Tôi không thể nói cho OP, nhưng trong Rails tôi thực sự thích chạy thử nghiệm end-to-end của tôi mỗi khi kiểm tra đơn vị vượt qua, và tôi muốn làm tương tự trong Angular. Sau khi tất cả, người ta nên kiểm tra mỗi khi một cái gì đó có thể có thể phá vỡ, và thay đổi HTML chắc chắn có thể phá vỡ một ứng dụng JS. Chắc chắn, các bài kiểm tra đơn vị là hàng phòng thủ đầu tiên, nhưng họ không phải là người duy nhất. Điểm của việc thử nghiệm là gì nếu nó bất tiện để chạy chúng? Thật tuyệt vời với tôi rằng nhóm Angular dường như đang tích cực * cản đường * thử nghiệm kết thúc ... –

+0

Marnen, tôi đồng ý với bạn về nguyên tắc nhưng khi bạn làm việc trong môi trường có nhiều đội ngũ phát triển đầy đủ kiểm tra un suốt cả ngày, nó có thể là hơi không thực tế để chạy một bộ đầy đủ các bài kiểm tra E2E trên mỗi check-in. Một sự thỏa hiệp là phải có một máy chủ chuyên dụng chạy các kiểm tra E2E cả ngày và luôn kéo mã cơ sở mới nhất trên mỗi chu kỳ.Nếu bạn đang làm việc trong môi trường với số lượng đăng ký hàng ngày rất thấp, thì bạn có thể thực hiện các bài kiểm tra E2E trên mỗi lần đăng ký. –

+0

Tôi đã nói về việc chạy các bài kiểm tra đầu cuối * cục bộ *, mà tôi làm vài phút một lần khi tôi đang phát triển. Số lượng nhà phát triển không có sự khác biệt, vì mỗi nhà phát triển chạy các thử nghiệm trên máy tính của riêng mình. Tất nhiên một máy chủ CI là hữu ích để đảm bảo rằng tất cả các bài kiểm tra được chạy trên một xây dựng hoặc hợp nhất, nhưng đó không phải là những gì tôi đã nói về. –

2

Tại sao tôi cần thêm tác vụ để khởi động máy chủ grunt của mình để truy cập ứng dụng angularjs của tôi?

Khi tách mối quan tâm Thước đo không quản lý spinup và teardown của máy chủ web để chạy thử nghiệm, đây là một cách tiếp cận khác với Karma. Tôi sẽ tưởng tượng điều này là do thực tế là các bài kiểm tra được chạy ở phía máy chủ, nơi một trình duyệt web được "điều khiển" để thực hiện các hành động từ mã kiểm tra của bạn.

Có cách nào để ngăn chặn thước đo góc khỏi việc giết chết phiên bản Chrome không?

Trả lời ngắn NO.
Câu trả lời dài, bạn có thể sử dụng tùy chọn debug và đặt điểm ngắt trong mã của bạn, nhưng đó có thể không phải là những gì bạn đang tìm kiếm.Tùy chọn keepAlive bạn đã cố gắng chỉ giữ cho trình duyệt tồn tại nếu thử nghiệm không thành công, nó không giữ cho trình duyệt bật lên khi kiểm tra kết thúc.

Điều này question có thể bạn quan tâm.

0

Có cách nào để ngăn chặn thước đo góc khỏi việc giết chết phiên bản Chrome không?

Tôi tin rằng bạn có thể tạm dừng trình duyệt bằng cách sử dụng:

browser.pause(); 
1

Ngoài @Always Learning câu trả lời mà tôi nghĩ là một trong những quyền.

Những gì bạn đang cố gắng làm là Continuous Integration, đây là một thực tế mà mỗi khi ai đó làm việc trên một dự án tạo ra một sự thay đổi và cam kết, toàn bộ kiểm tra chất lượng được thực hiện (phân tích mã tĩnh, kiểm tra đơn vị, Compilation/phụ thuộc, E2E kiểm tra, vv)

Điều đó không nên được thực hiện trong môi trường của nhà phát triển, cần được thực hiện bằng cách sử dụng công cụ hội nhập liên tục như Jenkins tôi khuyên bạn nên kiểm tra xem nó ra vì là một rất hữu ích công cụ, nó có thể chạy tất cả các nhiệm vụ mà bạn cần, gửi cho bạn tin nhắn khi có điều gì đó sai hoặc trước đó err ors đã được cố định, và thậm chí bạn có thể làm cho anh ta triển khai xây dựng cuối cùng trên môi trường sản xuất một khi được hoàn thành

1

Đến câu hỏi này khi tôi đang cố gắng làm điều tương tự ... khá mới để gulp (không chắc chắn nếu tôi đang làm tất cả những điều đúng) nhưng điều này làm việc cho tôi:

Tôi đã sử dụng gulp-angular-protractor thay vì gulp-thước đo góc cho các tác vụ tự động khởi động/dừng của webdriver.

Mẫu bên dưới chỉ xem thư mục 'specs', nhưng nó có thể dễ dàng thay đổi. Hủy bỏ 'browserync' nếu bạn không sử dụng nó và chỉ cần khởi động máy chủ cục bộ của bạn trước trên cổng bạn muốn.

var config = require('./config'); 
var gulp = require('gulp'); 
var browserSync = require('browser-sync'); 
var watch = require('gulp-watch'); 
var angularProtractor = require('gulp-angular-protractor'); 

gulp.task('e2e', [ 
    'browserSync', 
    'protractor', 
    'watch-e2e' 
]); 

gulp.task('watch-e2e', function() { 
    gulp.watch('e2e-tests/**/*.js', ['protractor']); 
}); 

// Setting up the test task 
gulp.task('protractor', function(callback) { 
    gulp 
     .src(['e2e-tests/**/*.js']) 
     .pipe(angularProtractor({ 
      configFile: './karma-e2e.conf.js', 
      args: ['--baseUrl', 'http://127.0.0.1:3002'], 
      debug: false, 
      autoStartStopServer: true 
     })) 
     .on('error', function(e) { 
      console.log(e); 
      this.emit('end'); // Prevents task stopping on error 
     }) 
     .on('end', function() { 
      // Close browser sync server 
      browserSync.exit(); 
      callback(); 
     }); 
}); 
+0

Xin lỗi, chỉ cần nhận ra câu hỏi này là cho grunt, không gulp, nhưng hy vọng nó sẽ giúp một ai đó! – Xuwen

0

trả lời cho vấn đề cũ .... Tôi thích Ruby FileWatcher Gem

gem install filewatcher filewatcher . "protractor my-protractor-conf-file.conf.js"

Nó hoạt động cho tất cả các loại vấn đề. Tôi sử dụng nó để chạy lại AsciiDoctor trên tài liệu đào tạo của tôi bất cứ khi nào tôi nhấn lưu.

Các vấn đề liên quan