جافاسكريبت - مشكلة مع سترايكر وجيست
أنا أقوم باختبار Stryker باستخدام Jest. يبدو أن Stryker لا يطبق اختبار Jest.
المتحوّران لا ينجحان في الاختبار إذا قمت بإدخالهما يدويًا في الكود، لكنهما ينجحان عندما أستخدم Stryker.
يبدو أن الاختبار لا يعمل على الطفرات. كيف يمكنني جعله يعمل؟
إليك تكويني:
package.json :
{
"name": "test-stryker",
"version": "1.0.0",
"description": "",
"main": "src/index.js",
"scripts": {
"test": "jest",
"test-mutation": "stryker run"
},
"author": "",
"license": "ISC",
"devDependencies": {
"npm": "^6.0.0",
"@stryker-mutator/javascript-mutator": "^3.3.0",
"@stryker-mutator/jest-runner": "^3.3.0",
"jest": "^26.0.0",
"jest-cli": "^26.0.0"
}
}
config.jest.js :
'use strict'
module.exports = {
clearMocks: true,
collectCoverage: true,
collectCoverageFrom: [
'**/*.js',
'!**/reports/**/*.js',
'!**/test/**/*.js',
'!/node_modules/',
'!**/*.config.js',
'!**/*.conf.js'
],
coverageDirectory: 'reports/coverage',
testEnvironment: 'node'
}
stryker.conf.js :
/**
* @type {import('@stryker-mutator/api/core').StrykerOptions}
*/
module.exports = {
mutator: "javascript",
reporters: ["html", "clear-text", "progress"],
testRunner: "jest",
coverageAnalysis: "off",
jest: {
configFile: "jest.config.js",
},
};
sum.js :
'use strict'
module.exports = (a, b) => {
return a + b
}
sum.test.js:
'use strict'
const sum = require('../../src/sum')
describe('sum', () => {
test('With two values should return two values added.', () => {
expect(sum(5,2)).toBe(7)
})
})
إليك النتيجة:
16:23:30 (21936) INFO ConfigReader Using stryker.conf.js
16:23:31 (21936) INFO InputFileResolver Found 1 of 12 file(s) to be mutated.
16:23:31 (21936) INFO InitialTestExecutor Starting initial test run. This may take a while.
16:23:35 (21936) INFO InitialTestExecutor Initial test run succeeded. Ran 1 tests in 4 seconds (net 3 ms, overhead 2707 ms).
16:23:35 (21936) INFO MutatorFacade 2 Mutant(s) generated
16:23:35 (21936) INFO SandboxPool Creating 4 test runners (based on CPU count)
Mutation testing [==================================================] 100% (elapsed: <1m, remaining: n/a) 2/2 tested (2 survived, 0 timed out)
0. [Survived] ArithmeticOperator
C:\webdev\experiment\node\test-stryker\src\sum.js:3:11
- return a + b
+ return a - b
1. [Survived] BlockStatement
C:\webdev\experiment\node\test-stryker\src\sum.js:2:27
- module.exports = (a, b) => {
- return a + b
- }
+ module.exports = (a, b) => {}
Ran 0.00 tests per mutant on average.
----------|---------|----------|-----------|------------|----------|---------|
File | % score | # killed | # timeout | # survived | # no cov | # error |
----------|---------|----------|-----------|------------|----------|---------|
All files | 0.00 | 0 | 0 | 2 | 0 | 0 |
sum.js | 0.00 | 0 | 0 | 2 | 0 | 0 |
----------|---------|----------|-----------|------------|----------|---------|
الإجابة رقم 1
لقد واجهت نفس المشكلة ووجدت أنها كانت على ما يبدو هذه المشكلة: https://github.com/stryker-mutator/stryker/issues/1566
أي أن ميزة "العثور على الاختبارات ذات الصلة" في jest لا يبدو أنها تعمل على نظام Windows. يعمل Stryker بالنسبة لي عندما أضيف هذا إلى stryker.config.json:
"jest": { "enableFindRelatedTests" : false }
لكن بالطبع هذا سيء حقًا للأداء في المشاريع الكبيرة. ربما مع بعض البحث الإضافي يمكن جعل الميزة تعمل. لست متأكدًا مما إذا كانت مشكلة عامة مع Jest أو تحدث فقط عند التشغيل بواسطة Stryker.
الإجابة رقم 2
توجد حلول بديلة أفضل متاحة. حل بديل بدون تأثير على الأداء:
إعادة تسمية مجلد .stryker-tmp ليصبح مجلدًا غير مخفي.
// stryker.conf.[js/json]
"tempDirName": "stryker-tmp",
(المصدر: https://github.com/stryker-mutator/stryker-js/issues/2122#issuecomment-605783668)
