Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Statyczna analiza aplikacji Symfony

Statyczna analiza aplikacji Symfony

Statyczna analiza przeprowadzana jest na kodzie źródłowym bez jego uruchamiania. Jako, że bywa pomocna w recenzjach kodu, jest często częścią procesu ciągłej integracji (ang. Continuous Integration). Potrafi być także niezastąpiona w zdobywaniu wiedzy o nieznajomym projekcie.

Przez swoją obiektywność, statyczna analiza pozwala na skupienie się na rzeczach istotnych dla biznesu, zamiast kłócenia się o literówki, standardy, czy praktyki. Niektóre narzędzia potrafią nawet zidentyfikować problemy z projektem kodu, jego utrzymaniem, czy wykryć błędy. Pozostaje zapytać, czy powinniśmy bezwzględnie ufać narzędziom?

Podczas prelekcji, Kuba wyjaśnił jak wcielić statyczną analizę kodu w projekt oparty o Symfony, aby pogłębić swoją percepcję o jego jakości.

Jakub Zalas

June 13, 2019
Tweet

More Decks by Jakub Zalas

Other Decks in Programming

Transcript

  1. @jakub_zalas Dzięki statycznej analizie możemy: • pogłębić wiedzę o projekcie

    • wykryć potencjalne błędy lub niewłaściwe założenia • wykryć problemy z jakością i utrzymać określony standard jakości • weryfikować czy decyzje architektoniczne są utrzymywane • wykryć problemy z bezpieczeństwem • przygotować się na wycofanie funkcjonalności • …
  2. @jakub_zalas Zalety automatyzacji • inspekcje kodu skupione na istocie problemu

    (zamiast dyskusji ile spacji powinno mieć wcięcie) • komputer jest nieomylny i bezwzględny (nigdy nie zapomni wypomnieć Ci błędu) • mniej okazji do konfliktów w zespole (to komputer mówi “NIE")
  3. Cyclomatic complexity Złożoność cyklomatyczna Metryka odzwierciedlająca stopień skomplikowania programu. Liczba

    niezależnych ścieżek wykonania programu Ścieżka jest niezależna, jeśli zawiera chociaż jeden fragment który nie jest częścią innej ścieżki
  4. @jakub_zalas Złożoność cyklomatyczna M = E − N + 2P

    M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 =
  5. @jakub_zalas Złożoność cyklomatyczna 2 M = E − N +

    2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 = 4 4 1
  6. @jakub_zalas Złożoność cyklomatyczna M = E − N + 2P

    M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 =
  7. @jakub_zalas Złożoność cyklomatyczna M = E − N + 2P

    M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf 2 + - 2 = 5 5 1
  8. @jakub_zalas Złożoność cyklomatyczna M = E − N + 2P

    M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 =
  9. @jakub_zalas Złożoność cyklomatyczna M = E − N + 2P

    M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf 3 + - 2 = 8 7 1
  10. @jakub_zalas Złożoność cyklomatyczna M = E − N + 2P

    M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf 9
  11. Halstead metrics Metryka odzwierciedlająca stopień skomplikowania programu. Nacisk na złożoność

    obliczeniową Miara złożoności opierająca się na operatorach i argumentach
  12. @jakub_zalas unikalna liczba operatorów unikalna liczba operandów całkowita liczba operatorów

    całkowita liczba operandów 3 2 3 3 Słownictwo / Vocabulary 5 Rozmiar / Size 6 Objętość / Volume ~14 Trudność / Difficulty 2.25 Wysiłek / Effort 31.5 Błędy / Errors 0.0046 Czas na implementację 1.75s
  13. @jakub_zalas 171 - 5.2 * ln(Halstead Volume) - 0.23 *

    (Cyclomatic Complexity) - 16.2 * ln(Lines of Code) https://blogs.msdn.microsoft.com/codeanalysis/2007/11/20/maintainability-index-range-and-meaning/
  14. @jakub_zalas dephpend text src \ | grep -e '^App \\Entity'

    \ | grep 'Symfony \\Component \\DependencyInjection' \ && echo "Failed to meet a dependency criteria!” https://dephpend.com
  15. @jakub_zalas Własny serwer nieustannej integracji ;) mkdir -p jenkins/jenkins_home &&

    cd jenkins
 curl -Ls http: //mirrors.jenkins.io/war-stable/latest/jenkins.war \ -o jenkins.war
 JENKINS_HOME=$(pwd)/jenkins_home java -jar jenkins.war
  16. @jakub_zalas https://github.com/jakzal/phpqa • analyze - Visualizes metrics and source code

    • behat - Helps to test business expectations • churn - Discovers good candidates for refactoring • composer-normalize - Composer plugin to normalize composer.json files • dephpend - Detect flaws in your architecture • deprecation-detector - Finds usages of deprecated code • deptrac - Enforces dependency rules between software layers • design-pattern - Detects design patterns • diffFilter - Applies QA tools to run on a single pull request • ecs - Sets up and runs coding standard checks • infection - AST based PHP Mutation Testing Framework • parallel-lint - Checks PHP file syntax • paratest - Parallel testing for PHPUnit • pdepend - Static Analysis Tool • phan - Static Analysis Tool • php-coupling-detector - Detects code coupling issues • php-cs-fixer - PHP Coding Standards Fixer • php-formatter - Custom coding standards fixer • php-semver-checker - Suggests a next version according to semantic versioning • phpDocumentor - Documentation generator • phpbench - PHP Benchmarking framework • phpa - Checks for weak assumptions • phpca - Finds usage of non-built-in extensions • phpcb - PHP Code Browser • phpcbf - Automatically corrects coding standard violations • phpcf - Finds usage of deprecated features • phpcov - a command-line frontend for the PHP_CodeCoverage library • phpcpd - Copy/Paste Detector • phpcs - Detects coding standard violations • phpda - Generates dependency graphs • phpdoc-to-typehint - Automatically adds type hints and return types based on PHPDocs • phpinsights - Analyses code quality, style, architecture and complexity • phplint - Lints php files in parallel • phploc - A tool for quickly measuring the size of a PHP project • phpmd - A tool for finding problems in PHP code • phpmetrics - Static Analysis Tool • phpmnd - Helps to detect magic numbers • phpspec - SpecBDD Framework • phpstan - Static Analysis Tool • phpunit - The PHP testing framework • psalm - Finds errors in PHP applications • psecio-parse - Scans code for potential security-related issues • rector - Tool for instant code upgrades and refactoring • roave-backward-compatibility-check - Tool to compare two revisions of a class API to check f • security-checker - Checks composer dependencies for known security vulnerabilities • simple-phpunit - Provides utilities to report legacy tests and usage of deprecated code • testability - Analyses and reports testability issues of a php codebase