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.

1a4e1f98f3aeef310273366c8c785207?s=128

Jakub Zalas

June 13, 2019
Tweet

Transcript

  1. Statyczna analiza aplikacji Symfony Jakub Zalas

  2. @jakub_zalas Statyczna analiza kodu Analiza programu bez jego uruchamiania.

  3. @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 • …
  4. @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")
  5. Badanie kodu

  6. https://github.com/symfony/demo

  7. phplint --jobs 10 src https://github.com/overtrue/phplint

  8. @jakub_zalas phploc src https://github.com/sebastianbergmann/phploc

  9. @jakub_zalas phpmetrics --report-html=metrics . http://www.phpmetrics.org

  10. @jakub_zalas

  11. @jakub_zalas

  12. @jakub_zalas

  13. @jakub_zalas

  14. @jakub_zalas

  15. @jakub_zalas

  16. @jakub_zalas

  17. @jakub_zalas

  18. dephpend metrics src

  19. @jakub_zalas

  20. pdepend --jdepend-chart=chart.png src https://github.com/pdepend/pdepend

  21. @jakub_zalas

  22. source: jenkins-php.org

  23. 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
  24. @jakub_zalas Złożoność cyklomatyczna 1

  25. @jakub_zalas Złożoność cyklomatyczna

  26. @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 =
  27. @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
  28. @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 =
  29. @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
  30. @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 =
  31. @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
  32. @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
  33. @jakub_zalas Jak dużą złożoność jesteśmy w stanie ogarnąć? 1 10

    20 50
  34. @jakub_zalas churn run src

  35. @jakub_zalas churn run src

  36. 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
  37. @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
  38. Maintainability index Odzwierciedla względną łatwość utrzymania kodu Wartość pomiędzy 0

    a 100 0 - 9 tragedia 10 - 19 umiarkowany 20 - 100 dobry
  39. @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/
  40. Widok zależności

  41. @jakub_zalas dephpend dot -o dependencies.svg —depth 2 --no-classes src https://dephpend.com

  42. phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

  43. @jakub_zalas phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

  44. Automatyzacja decyzji

  45. @jakub_zalas

  46. phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

  47. phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

  48. dephpend text src https://dephpend.com

  49. @jakub_zalas dephpend text src | grep -e '^App \\Entity' https://dephpend.com

  50. @jakub_zalas dephpend text src \ | grep -e '^App \\Entity'

    \ | grep 'Symfony \\Component \\DependencyInjection' \ && echo "Failed to meet a dependency criteria!” https://dephpend.com
  51. @jakub_zalas deptrac --formatter-graphviz \ --formatter-graphviz-dump-image=dependencies.png https://github.com/sensiolabs-de/deptrac

  52. depfile.yml

  53. @jakub_zalas

  54. @jakub_zalas

  55. @jakub_zalas

  56. Wykrywanie problemów

  57. phpcpd src https://github.com/sebastianbergmann/phpcpd

  58. @jakub_zalas phpinsights analyse https://phpinsights.com

  59. @jakub_zalas

  60. @jakub_zalas

  61. @jakub_zalas phpinsights.php

  62. @jakub_zalas phan --init --init-level 1 && phan --color https://github.com/phan/phan

  63. @jakub_zalas phpstan analyse --level 0 src https://github.com/phpstan/phpstan phpstan analyse -l

    2 src
  64. @jakub_zalas phpstan analyse --level 3 src https://github.com/phpstan/phpstan

  65. @jakub_zalas phpstan analyse --level 4 src https://github.com/phpstan/phpstan

  66. @jakub_zalas phpstan analyse --level 5 src https://github.com/phpstan/phpstan

  67. @jakub_zalas phpstan analyse --level 6 src https://github.com/phpstan/phpstan

  68. @jakub_zalas phpstan analyse --level 6 src https://github.com/phpstan/phpstan

  69. @jakub_zalas phpstan analyse --level 6 src https://github.com/phpstan/phpstan

  70. @jakub_zalas phpstan analyse --level 7 src https://github.com/phpstan/phpstan

  71. @jakub_zalas phpstan analyse --level 7 src https://github.com/phpstan/phpstan

  72. @jakub_zalas phpstan analyse --level 7 src https://github.com/phpstan/phpstan

  73. @jakub_zalas phpstan analyse --level max src https://github.com/phpstan/phpstan

  74. @jakub_zalas phpstan.neon

  75. psalm src https://psalm.dev

  76. psalm.xml

  77. phpmnd src

  78. Bezpieczeństwo

  79. phpqa security-checker security:check https://github.com/sensiolabs/security-checker

  80. psecio-parse scan src https://github.com/psecio/parse

  81. psecio-parse rules https://github.com/psecio/parse

  82. Monitorowanie wycofywanych funkcjonalności & kompatybilność wsteczna

  83. deprecation-detector check --log-html=deprecated.html src https://github.com/sensiolabs-de/deprecation-detector

  84. phpcf src https://github.com/wapmorgan/PhpCodeFixer

  85. roave-backward-compatibility-check roa:a --from v1.4.0 https://github.com/Roave/BackwardCompatibilityCheck

  86. Styl

  87. php-cs-fixer fix src --diff https://cs.symfony.com

  88. @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
  89. Jakość jako usługa

  90. None
  91. @jakub_zalas

  92. @jakub_zalas https://twitter.com/ChristinGorman/status/1137996442214252544

  93. @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
  94. @jakub_zalas Dziękuję za uwagę Kontakt: jakub@zalas.pl @jakub_zalas @jakzal