JavaScript Qualitätssicherung

Post on 27-May-2015

543 views 0 download

transcript

Werkzeuge zur Qualitätssicherung in JavaScript

Tuesday 5 November 13

WER BIN ICH?

• Sebastian Springer

• https://github.com/sspringer82

• @basti_springer

Tuesday 5 November 13

JAVASCRIPT?

Tuesday 5 November 13

QUALITÄT?

Tuesday 5 November 13

Unter Softwarequalität versteht man die Gesamtheit der Merkmale und Merkmalswerte eines

Softwareprodukts, die sich auf dessen Eignung beziehen, festgelegte oder vorausgesetzte Erfordernisse zu

erfüllen.(Balzert)

Tuesday 5 November 13

DOKUMENTATION?

Tuesday 5 November 13

README.MD

Tuesday 5 November 13

API DOC

npm install -g git://github.com/jsdoc3/jsdoc.git

Tuesday 5 November 13

STATISCHE VS. DYNAMISCHE CODEANALYSE

Tuesday 5 November 13

STATISCHE CODEANALYSE

Tuesday 5 November 13

TOKENIZER?

Tuesday 5 November 13

var answer = 6 * 7;

Tuesday 5 November 13

SYNTAX{ "type": "Program", "body": [ { "type": "VariableDeclaration", "declarations": [ { "type": "VariableDeclarator", "id": { "type": "Identifier", "name": "answer" }, "init": { "type": "BinaryExpression", "operator": "*", "left": { "type": "Literal", "value": 6, "raw": "6" }, "right": { "type": "Literal", "value": 7, "raw": "7" } } } ], "kind": "var" } ]}

Tuesday 5 November 13

TOKENS[ { "type": "Keyword", "value": "var" }, { "type": "Identifier", "value": "answer" }, { "type": "Punctuator", "value": "=" }, { "type": "Numeric", "value": "6" }, { "type": "Punctuator", "value": "*" }, { "type": "Numeric", "value": "7" }, { "type": "Punctuator", "value": ";" }]

Tuesday 5 November 13

VALIDATOR VS. LINTER

Tuesday 5 November 13

Tuesday 5 November 13

by Douglas Crockford

Tuesday 5 November 13

by Douglas Crockford

Warning: JSLint will hurt your feelings

Tuesday 5 November 13

sudo npm install -g jslint

Tuesday 5 November 13

var Calculator = function () {};

Calculator.prototype.add = function(a, b) {

if('number' !== typeof a ||'number' !== typeof b) throw new Error('Can add only numbers');

return a+b;

}

Tuesday 5 November 13

#1 Missing 'use strict' statement. var Calculator = function () {}; // Line 1, Pos 31 #2 Empty block. var Calculator = function () {}; // Line 1, Pos 30 #3 Expected exactly one space between 'function' and '('. Calculator.prototype.add = function(a, b) { // Line 3, Pos 36 #4 Missing 'use strict' statement. if('number' !== typeof a ||'number' !== typeof b) // Line 5, Pos 5 #5 Expected exactly one space between 'if' and '('. if('number' !== typeof a ||'number' !== typeof b) // Line 5, Pos 7 #6 Missing space between '||' and 'number'. if('number' !== typeof a ||'number' !== typeof b) // Line 5, Pos 32 #7 Expected exactly one space between ')' and 'throw'. throw new Error('Can add only numbers'); // Line 6, Pos 9 #8 Expected '{' and instead saw 'throw'. throw new Error('Can add only numbers'); // Line 6, Pos 9 #9 Stopping. (54% scanned). // Line 6, Pos 9

Tuesday 5 November 13

ESVALIDATEby http://esprima.org/

Tuesday 5 November 13

sudo npm install -g esvalidate

Tuesday 5 November 13

return 42; // Return statement not inside a function

function f() { 'use strict';

// No more octal var x = 042;

// Duplicate property var y = { x: 1, x: 2 };

// With statement can't be used with (z) {}}

Tuesday 5 November 13

validate.js:1: Illegal return statementvalidate.js:7: Octal literals are not allowed in strict mode.validate.js:10: Duplicate data property in object literal not allowed in strict modevalidate.js:10: Strict mode code may not include a with statement

Tuesday 5 November 13

KOMPLEXITÄT

Tuesday 5 November 13

PLATO

Tuesday 5 November 13

Tuesday 5 November 13

LOC

Maintainability

Estimated Errors in Implementation

Lint Errors

Tuesday 5 November 13

Tuesday 5 November 13

run.sh pmd -d ./pmd -rulesets ecmascript-basic

Tuesday 5 November 13

pmd/example.js:3:!Avoid assignments in operandspmd/example.js:3:!Avoid using global variablespmd/example.js:3:!Use ===/!== to compare with true/false or Numbers

Tuesday 5 November 13

AssignmentInOperand

UnreachableCode

InaccurateNumericLiteral

ConsistentReturn

ScopeForInVariable

EqualComparison

GlobalVariable AvoidTrailingComma

UseBaseWithParseInt

Tuesday 5 November 13

CPD

Tuesday 5 November 13

run.sh cpd --minimum-tokens 12 --files /path/to/src --language ecmascript --

format xml > cpd.xml

Tuesday 5 November 13

TESTS

Tuesday 5 November 13

FRAMEWORKS

Tuesday 5 November 13

FRAMEWORKSSinon.js

Tuesday 5 November 13

FRAMEWORKS

jsunit

Sinon.js

Tuesday 5 November 13

FRAMEWORKS

jsunit

doh

Sinon.js

Tuesday 5 November 13

FRAMEWORKS

jsunit

dohJS Test Driver

Sinon.js

Tuesday 5 November 13

FRAMEWORKS

jsunit

qunit

dohJS Test Driver

Sinon.js

Tuesday 5 November 13

FRAMEWORKS

jsunit

qunit

dohJasmine JS Test Driver

Sinon.js

Tuesday 5 November 13

FRAMEWORKS

jsunit

qunit

dohJasmine JS Test Driver

Sinon.js Siesta

Tuesday 5 November 13

FRAMEWORKS

jsunit

qunit

dohJasmine JS Test Driver

Sinon.js Siesta

Karma

Tuesday 5 November 13

SERVERSIDE VS. CLIENTSIDE

Tuesday 5 November 13

Tuesday 5 November 13

Tuesday 5 November 13

COVERAGE

Tuesday 5 November 13

Tuesday 5 November 13

ENTWICKLUNGSUMGEBUNG(IDE)

Tuesday 5 November 13

Tuesday 5 November 13

SERVERSIDE

https://code.google.com/p/js-test-driver/Tuesday 5 November 13

AUTOMATISIERUNG

Tuesday 5 November 13

Tuesday 5 November 13

JENKINS

Tasks per Ant ausführen

Visualisierung über Plugins

Tuesday 5 November 13

FRAGEN?

Tuesday 5 November 13

Sebastian Springersebastian.springer@mayflower.de

Mayflower GmbHMannhardtstr. 680538 MünchenDeutschland

@basti_springer

https://github.com/sspringer82

Kontakt

Tuesday 5 November 13