簡體   English   中英

Karma/Jasmine 在沒有運行測試的情況下超時

[英]Karma/Jasmine times out without running tests

我正在嘗試在使用http://newtriks.com/2013/12/31/automating-react-with-yeoman-and-grunt/生成的項目上從 Grunt 運行 Karma/Jasmine

Karma 啟動 PhantomJS(或 Chrome),並且根據 singleRun,它要么超時,要么只是坐在那里什么都不做。 我已經嘗試根據閱讀有類似問題的人的解決方案來更改captureTimeoutbrowserNoActivityTimeout ,但它似乎不起作用。

我的相關包版本等:

  • 節點JS:0.10.25
  • 業力:0.12.16
  • Webpack:1.1.11
  • webpack-開發服務器:1.4.1
  • 業力茉莉花:0.1.5
  • Linux:Ubuntu 14.04

我發現有人在 OS X 上有同樣的問題

我已經嘗試將我所有的開發依賴項更新到最新版本,但問題仍然存在。

我的控制台 output 在下面。 webpack 行引用bundle is now VALID/INVALID令人擔憂,但我找不到關於它們含義的任何信息。 這是我的控制台 output:

Running "karma:unit" (karma) task
DEBUG [config]: autoWatch set to false, because of singleRun
DEBUG [plugin]: Loading karma-* from /home/ed/workspace/wwb-app/node_modules
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-chrome-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-coffee-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-firefox-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-html2js-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-jasmine.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-requirejs.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-script-launcher.
DEBG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-webpack-plugin.
INFO [karma]: Karma v0.12.16 server started at  http://localhost:8080/
INFO [launcher]: Starting browser PhantomJS
DEBUG [temp-dir]: Creating temp dir at /tmp/karma-98204612
DEBUG [launcher]: /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom/bin/phantomjs /tmp/karma-98204612/capture.js
Hash: 89285186567c1bc5bb7f
Version: webpack 1.1.11
Time: 2ms
Asset  Size  Chunks       Chunk Names
webpack: bundle is now VALID.
webpack: bundle is now INVALID.
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/karma.js
DEBUG [web-server]: upgrade /socket.io/1/websocket/CjC8pnQq5It2z_kWYB98
DEBUG [karma]: A browser has connected on socket CjC8pnQq5It2z_kWYB98
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket CjC8pnQq5It2z_kWYB98 with id 98204612
DEBUG [launcher]: PhantomJS (id 98204612) captured in 1.704 secs
WARN [PhantomJS 1.9.7 (Linux)]: Disconnected (1 times), because no message in 30000 ms.

DEBUG [karma]: Run complete, exitting.
DEBUG [launcher]: Disconnecting all browsers
DEBUG [launcher]: Process PhantomJS exited with code 0
DEBUG [temp-dir]: Cleaning temp dir /tmp/karma-98204612
Warning: Task "karma:unit" failed. Use --force to continue.

Aborted due to warnings.

這是我的karma.conf.js文件:

'use strict';

module.exports = function (config) {
config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
        'test/helpers/**/*.js',
        'test/spec/components/**/*.js'
    ],
    preprocessors: {
        'test/spec/components/**/*.js': ['webpack']
    },
    webpack: {
        cache: true,
        module: {
            loaders: [{
                test: /\.css$/,
                loader: 'style!css'
            }, {
                test: /\.gif/,
                loader: 'url-loader?limit=10000&minetype=image/gif'
            }, {
                test: /\.jpg/,
                loader: 'url-loader?limit=10000&minetype=image/jpg'
            }, {
                test: /\.png/,
                loader: 'url-loader?limit=10000&minetype=image/png'
            }, {
                test: /\.js$/,
                loader: 'jsx-loader'
            }]
        }
    },
    webpackServer: {
        stats: {
            colors: true
        }
    },
    exclude: [],
    port: 8080,
    logLevel: config.LOG_DEBUG,
    colors: true,
    autoWatch: true,
    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: ['PhantomJS'],
    reporters: ['progress'],
    captureTimeout: 60000,
    browserNoActivityTimeout: 60000,
    singleRun: true
});
};

我有同樣的問題。 從相關的GitHub 問題 中,我了解到您可以延長不活動超時。

在您的 gruntfile 或 karma 配置文件中設置此 Karma 配置選項:

browserNoActivityTimeout: 100000

我將它設置為 100 秒,我的測試成功運行。 我不知道是什么導致了延遲。

我已將 Karma 配置更改為

captureTimeout: 60000, // it was already there
browserDisconnectTimeout : 10000,
browserDisconnectTolerance : 1,
browserNoActivityTimeout : 60000,//by default 10000

另外我有 200-300 個測試,PhantomJS 1.9.8,它只需要大約 100 mb 的內存用於 Phantom 與 grunt 和 karma 他們一起使用了大約 300mb 的內存。

我們在構建服務器上遇到了類似的問題。

增加 browserNoActivityTimeout 工作到一定程度。 我們將它提高到 60000 毫秒,但是隨着單元測試數量的增加,phantomJS 沒有斷開連接的問題又回來了。

我們最終將問題追溯到 phantomJS 可用的 RAM。 我們有 1100 個單元測試需要大約 1 分鍾 30 秒才能運行,但 phantomJS 將無法在 60000 毫秒超時內斷開連接。

構建節點 VM RAM 從 2GB 增加到 4GB,然后 1100 個單元測試需要大約 45 秒才能運行,而 phantomJS 將在大約 5 秒內斷開連接。 一個巨大的改進。

有兩個教訓: 1. PhantomJS 需要內存,因此請確保它有足夠的 RAM 來完成它的工作 2. 分析您的代碼以了解在何處可以更有效地使用內存。

另一個可能的解釋是 RequireJS 妨礙了。 如果我將 'requirejs' 添加到 config.frameworks 數組中的 karma.conf.js,我會得到這個確切的錯誤。 這似乎覆蓋了原生的 require 函數並導致測試無法執行。 在我的情況下,描述塊被觸發,但如果它塊被觸發,則沒有。

就我而言,我沒有在 test.js 文件中包含以下代碼:

requirejs.config({
    callback: window.__karma__.start
});

describe('tests', function() {
    ...

一旦包含此配置,測試就開始運行。 希望這可以減輕其他人的壓力!

從 karma 配置文件中刪除“requires”,只需使用框架:['jasmine']。

檢查localhost是否正確指向127.0.0.1而不是無法訪問的 IP,這可能發生在使用虛擬機的開發環境中。

我為我自己的環境解決了這個問題。 我在全球安裝了一堆 nodejs 包。 我沒有做回歸來確切地找出導致問題的包,但我強烈懷疑全球安裝了 karma 是原因。

如果您遇到此問題,請嘗試

sudo npm -g remove karma

如果這不起作用,那么我將刪除所有全局節點包(例如 yeoman、grunt-cli 等真正的全局包除外)。 然后在本地為您的項目安裝。

我還注意到,當您在 OS X 上運行sudo npm -i時,它會將~/.npm的所有者更改為root ,隨后的npm -i命令將失敗並顯示EACCESS錯誤。

此處的 OP 可能不是這種情況,但是如果您正在測試的代碼遇到無限循環,則會像這樣導致超時斷開連接。

這就是我收到此錯誤的原因,可能會幫助處於類似情況的人。 我的主要組件有多個使用不同服務的子組件,其中一個服務有一個 HTTP 調用,初始化失敗,因為我在子組件的 ngInit() 方法中使用該服務。 為了解決這個問題,我必須在主要組件規范中導入上述服務並為該服務附加一個模擬,然后它開始工作。

@Vijender 的回答讓我走上了正軌

就像用HttpClientModule替換測試中的HttpClientTestingModule一樣簡單。

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule
      ]
    }).compileComponents();
  }));

我通過在我的 Root.tsx 中刪除全局范圍內對異步函數的調用來解決此問題。

它在“真實”的瀏覽器窗口中工作,但在測試運行中不起作用。

它似乎使加載模塊本身掛起,因此它甚至沒有執行異步函數(因此不會顯示日志語句)

afterEach(function () {
    document.body.innerHTML = '';
});

為我添加這個已修復的問題,測試開始運行得更快。 似乎它減少了無頭瀏覽器的負載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM