dbwebb-se / mvc

Course repo for the mvc and object orientation in frameworks course - mvc.
Other
1 stars 4 forks source link

Code coverage: Scrutinizer vs. php-code-coverage #39

Closed xlsson closed 3 years ago

xlsson commented 3 years ago

php-code-coverage scrut

Mina enhetstester för controller-klasserna verkar inte riktigt accepteras under code coverage på Scrutinizer. Konstigt nog har jag fått A-betyg under en annan flik (se nedan). Även där visas att 0 % av metoderna testats.

Vad skulle kunna vara fel? Nedan finns även min .scrutinizer.yml och .phpunit.xml.

https://scrutinizer-ci.com/g/radonhus/bth-mvc-framework/

scrut-ratings

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="tests/config.php" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
  <coverage processUncoveredFiles="true">
    <include>
        <directory suffix=".php">app/Http/Controllers</directory>
        <directory suffix=".php">app/Models/Book</directory>
        <directory suffix=".php">app/Models/Game21</directory>
        <directory suffix=".php">app/Models/Yatzy</directory>
        <file>routes/web.php</file>
    </include>
    <exclude>
        <file>./app/Http/Controllers/Controller.php</file>
    </exclude>
    <report>
        <clover outputFile="build/coverage.clover"/>
        <html outputDirectory="build/coverage" lowUpperBound="35" highLowerBound="70"/>
    </report>
  </coverage>
  <testsuites>
    <testsuite name="all">
      <directory>tests/Feature</directory>
      <directory>tests/Unit/Game21</directory>
      <directory>tests/Unit/Yatzy</directory>
    </testsuite>
  </testsuites>
  <logging/>
  <php>
    <env name="APP_ENV" value="testing" force="true"/>
  </php>
</phpunit>
imports:
    - php

filter:
    paths: ["app/Models/*", "app/Http/Controllers/*", "routes/web.php"]
    excluded_paths: [vendor/*, build/*, app/Models/User.php]

build:
    nodes:
        my-tests:
            environment:
                php:
                    version: 7.4
    tests:
        override:
            -
                command: "make phpunit"
                coverage:
                    file: "build/coverage.clover"
                    format: "php-clover"
mosbth commented 3 years ago

Generellt gäller att man får felsöka steg för steg.

  1. Kör testerna lokalt make phpunit. kolla kodtäckningen. kolla om clover-filen genereras.
  2. Dubbelkolla att scrutinizer.yaml innehåller samma setup.
  3. Bygg om på scrutniizer.
  4. Övervaka när scrutinizer bygger och se om allt ser bra ut. Eventuellt kolla loggen från bygget.
  5. Avancerat, kolla om man kan koppla sig med ssh till scrutinizer och köra bygget för hand, i dess riktiga miljö.

I ditt fall är det alltså enbart Controller som inte genererar coverage i Scrutinizer, men du får coverage lokalt? Och allt annat verkar stämma?

Då hade jag kikat på de testfallen som rör Controller-klasserna och försökt se om de hade någon speciell konstruktion i testfallen som gäller enbart för Controller-testerna och förekommer inte i de andra testerna.

Vi kan ju anse att det är avgränsat till Controller-klasser och i sammanhanget hur testerna exekveras på Scrutinizer.

Sen hade jag "chansat" lite för att avgränsa och testa mig fram.

Jag hade provat ändra från true till false (oklart om det spelar roll):

  <coverage processUncoveredFiles="true">

Eventuellt hade jag även kört make phpunit lokalt och satt APP_ENV='test'.

xlsson commented 3 years ago

Tackar! Punkt 4 var ett mycket bra tips: när jag övervakade vad Scrutinizer gjorde såg jag att en rad phpunit-tester failade när Scrutinizer körde dem. Jag fick ordning på det genom att, på samma vis som i config-filen för Travis, se till att miljövariablerna för projektet hänger med (och att miljövariablen APP_KEY genereras av artisan).

Dessa rader tillkom i min nya .scrutinizer.yml alltså:

   tests:
        before:
            - cp .env.scrutinizer .env
            - php artisan key:generate