не проходит API тест

Всё про тестирование в Yii 2.0
Ответить
nds
Сообщения: 12
Зарегистрирован: 2017.09.05, 07:57

не проходит API тест

Сообщение nds » 2019.11.11, 15:02

Имеется Api тест:

Код: Выделить всё

<?php
namespace tests\auth;

use app\fixtures\UserProfileFixture;
use tests\ApiTester;
use Codeception\Util\HttpCode;

class EmailLoginCest
{
    const URL = '/v1/auth/email-login';
    const LOGIN = 'email@example.com'; /** @see <app_path>/fixtures/data/user_profile.php */
    const PASSWORD = '12345'; /** @see <app_path>/fixtures/data/user.php */

    public function _fixtures()
    {
        return [
            'userProfile' => UserProfileFixture::class
        ];
    }

//    public function login(ApiTester $I)
//    {
//        $data = [
//            'email' => self::LOGIN,
//            'password' => self::PASSWORD,
//        ];
//
//        $I->sendPOST(self::URL, $data);
//        $I->seeResponseCodeIs(HttpCode::OK);
//        $I->seeResponseJsonMatchesJsonPath('$.result.token');
//    }

    public function wrongUserNameLogin(ApiTester $I)
    {
        $data = [
            'email' => '_' . self::LOGIN,
            'password' => self::PASSWORD,
        ];

        $I->sendPOST(self::URL, $data);
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
        $I->seeResponseContainsJson([
            'result' => NULL
        ]);
    }
}
если какой-либо из методов закомментирован(или его нет вообще), тогда тест отрабатывает нормально:

Код: Выделить всё

Codeception PHP Testing Framework v2.4.4
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

Tests.api Tests (1) -----------------------------------------------------------------------------------------------------------------------------------------------------------
✔ EmailLoginCest: Wrong user name login (0.07s)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Time: 222 ms, Memory: 12.00MB

OK (1 test, 2 assertions)
Стоит только запустить тест с двумя методами то появляется ошибка(метод login() раскомментирован):

Код: Выделить всё

Codeception PHP Testing Framework v2.4.4
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

Tests.api Tests (2) -----------------------------------------------------------------------------------------------------------------------------------------------------------
✔ EmailLoginCest: Login (0.58s)
E EmailLoginCest: Wrong user name login 

In Yii2.php line 346:
                                                                   
  Undefined property: Codeception\Module\Yii2::$connectionWatcher
При этом нет разницы, какой метод закомментировать (wrongUserNameLogin или login) - отработает всегда один, а второй упадет
Конфиг codeception.yml:

Код: Выделить всё

namespace: tests
suites:
    unit:
        path: .
        actor: UnitTester
        modules:
            enabled:
                # add more modules here
                - Asserts
settings:
    bootstrap: _bootstrap.php
    suite_class: \PHPUnit_Framework_TestSuite
    memory_limit: 1024M
    log: true
    colors: true
paths:
    tests: tests
    output: tests/_output
    support: tests/_support
    data: tests
modules:
    config:
        Yii2:
            configFile: tests/_config/test.web.php
Конфиг tests/api.suite.yml:

Код: Выделить всё

actor: ApiTester
modules:
  enabled:
    - REST:
        depends: PhpBrowser
        url: http://nginx-host/
    - Yii2:
        part: [fixtures]
        entryScript: web/index-test.php

Аватара пользователя
Chelobaka
Сообщения: 201
Зарегистрирован: 2018.06.01, 09:54

Re: не проходит API тест

Сообщение Chelobaka » 2019.11.11, 15:38

vendor/bin/codecept run acceptance --debug -c yourTest

Поможет увидеть более детально что не так с тестом.

nds
Сообщения: 12
Зарегистрирован: 2017.09.05, 07:57

Re: не проходит API тест

Сообщение nds » 2019.11.11, 16:07

Chelobaka писал(а):
2019.11.11, 15:38
vendor/bin/codecept run acceptance --debug -c yourTest

Поможет увидеть более детально что не так с тестом.

Код: Выделить всё

Codeception PHP Testing Framework v2.4.4
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

Tests.api Tests (2) --------------------------------------------------------------------------------------------------------------------------------------------------------------------
Modules: REST, PhpBrowser, Yii2
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
EmailLoginCest: Login
Signature: tests\auth\EmailLoginCest:login
Test: tests/api/auth/EmailLoginCest.php:login
Scenario --
  Destroying application
  Starting application
  [ConnectionWatcher] watching new connections
  [Fixtures] Loading fixtures
  [ConnectionWatcher] watching new connections
  [yii\db\Connection::open] 'Opening DB connection: pgsql:host=host;port=5432;dbname=database'
  [ConnectionWatcher] Connection opened!
  [ConnectionWatcher] Connection opened!
  [ConnectionWatcher] no longer watching new connections
  [ConnectionWatcher] closing all (1) connections
  [Fixtures] Done
  [TransactionForcer] watching new connections
 I send post "/v1/auth/email-login",{"email":"email@example.com","password":"12345"}
  [Request] POST http://nginx-host//v1/auth/email-login {"email":"email@example.com","password":"12345"}
  [Request Headers] []
  [Page] http://nginx-host//v1/auth/email-login
  [Response] 200
  [Request Cookies] []
  [Response Headers] {"Server":["nginx/1.17.5"],"Date":["Mon, 11 Nov 2019 13:03:31 GMT"],"Content-Type":["application/json; charset=UTF-8"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"X-Powered-By":["PHP/7.2.24"],"Token":["o0eF-BMoW0u3NxPOD0zE5wzSwQXRcawH"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent"]}
  [Response] {"result":{"token":"o0eF-BMoW0u3NxPOD0zE5wzSwQXRcawH"},"errorMessage":null,"responseCode":200}
 I see response code is 200
 I see response json matches json path "$.result.token"
 PASSED 

  [TransactionForcer] no longer watching new connections
  [ConnectionWatcher] no longer watching new connections
  [ConnectionWatcher] closing all (1) connections
  [yii\db\Connection::open] 'Opening DB connection: pgsql:host=fschool_db;port=5432;dbname=fschool'
  Destroying application
EmailLoginCest: Wrong user name login
Signature: tests\auth\EmailLoginCest:wrongUserNameLogin
Test: tests/api/auth/EmailLoginCest.php:wrongUserNameLogin
Scenario --
  Destroying application
  Starting application
 ERROR 


In Yii2.php line 346:
                                                                   
  [yii\base\ErrorException (8)]                                    
  Undefined property: Codeception\Module\Yii2::$connectionWatcher  
                                                                   

Exception trace:
 yii\base\ErrorHandler->handleError() at /app/vendor/codeception/base/src/Codeception/Module/Yii2.php:346
 Codeception\Module\Yii2->_after() at /app/vendor/codeception/base/src/Codeception/Subscriber/Module.php:66
 Codeception\Subscriber\Module->after() at /app/vendor/symfony/event-dispatcher/EventDispatcher.php:212
 Symfony\Component\EventDispatcher\EventDispatcher->doDispatch() at /app/vendor/symfony/event-dispatcher/EventDispatcher.php:44
 Symfony\Component\EventDispatcher\EventDispatcher->dispatch() at /app/vendor/codeception/phpunit-wrapper/src/Listener.php:133
 Codeception\PHPUnit\Listener->fire() at /app/vendor/codeception/phpunit-wrapper/src/Listener.php:119
 Codeception\PHPUnit\Listener->endTest() at /app/vendor/phpunit/phpunit/src/Framework/TestResult.php:408
 PHPUnit\Framework\TestResult->endTest() at /app/vendor/codeception/base/src/Codeception/Test/Test.php:111
 Codeception\Test\Test->run() at /app/vendor/phpunit/phpunit/src/Framework/TestSuite.php:755
 PHPUnit\Framework\TestSuite->run() at /app/vendor/codeception/phpunit-wrapper/src/Runner.php:106
 Codeception\PHPUnit\Runner->doEnhancedRun() at /app/vendor/codeception/base/src/Codeception/SuiteManager.php:157
 Codeception\SuiteManager->run() at /app/vendor/codeception/base/src/Codeception/Codecept.php:189
 Codeception\Codecept->runSuite() at /app/vendor/codeception/base/src/Codeception/Codecept.php:158
 Codeception\Codecept->run() at /app/vendor/codeception/base/src/Codeception/Command/Run.php:355
 Codeception\Command\Run->execute() at /app/vendor/symfony/console/Command/Command.php:251
 Symfony\Component\Console\Command\Command->run() at /app/vendor/symfony/console/Application.php:886
 Symfony\Component\Console\Application->doRunCommand() at /app/vendor/symfony/console/Application.php:262
 Symfony\Component\Console\Application->doRun() at /app/vendor/symfony/console/Application.php:145
 Symfony\Component\Console\Application->run() at /app/vendor/codeception/base/src/Codeception/Application.php:108
 Codeception\Application->run() at /app/vendor/codeception/base/codecept:42

nds
Сообщения: 12
Зарегистрирован: 2017.09.05, 07:57

Re: не проходит API тест

Сообщение nds » 2019.11.11, 18:42

Обновил codeception/base до 2.4.5 и предыдущая ошибка пропала.
Теперь новая проблема. Для наглядности убрал весь код из методов(запуск теста произвожу так же без кода в методах):

Код: Выделить всё

<?php
namespace tests\auth;

use tests\ApiTester;

class EmailLoginCest
{

    public function testLogin(ApiTester $I)
    {
    }

    public function testWrongUserNameLogin(ApiTester $I)
    {
    }
}
Запускаю тест и получаю ошибку:

Код: Выделить всё

Tests.api Tests (2) -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Modules: REST, PhpBrowser, Yii2
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
EmailLoginCest: Test login
Signature: tests\auth\EmailLoginCest:testLogin
Test: tests/api/auth/EmailLoginCest.php:testLogin
Scenario --
  Destroying application
  Starting application
  [ConnectionWatcher] watching new connections
  [Fixtures] Loading fixtures
  [Fixtures] Done
  [TransactionForcer] watching new connections
 PASSED 

  [TransactionForcer] no longer watching new connections
  Destroying application
  [ConnectionWatcher] no longer watching new connections
  [ConnectionWatcher] closing all (0) connections
EmailLoginCest: Test wrong user name login
Signature: tests\auth\EmailLoginCest:testWrongUserNameLogin
Test: tests/api/auth/EmailLoginCest.php:testWrongUserNameLogin
Scenario --
  Destroying application
  Starting application
 ERROR 

  Destroying application
  Suite done, restoring $_SERVER to original
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Time: 71 ms, Memory: 10.00MB

There was 1 error:

---------
1) EmailLoginCest: Test wrong user name login
 Test  tests/api/auth/EmailLoginCest.php:testWrongUserNameLogin
                                                                   
  [yii\base\ErrorException] Cannot use a scalar value as an array  
                                                                   
#1  /app/vendor/symfony/event-dispatcher/EventDispatcher.php:212
#2  /app/vendor/symfony/event-dispatcher/EventDispatcher.php:44

ERRORS!
Tests: 2, Assertions: 0, Errors: 1.
Проблема чем то похожа на предыдущую - при комментировании одного из методов тест проходит нормально.
В общем новый баг):

Код: Выделить всё

 [yii\base\ErrorException] Cannot use a scalar value as an array

Аватара пользователя
Chelobaka
Сообщения: 201
Зарегистрирован: 2018.06.01, 09:54

Re: не проходит API тест

Сообщение Chelobaka » 2019.11.12, 10:05

Если у вас не запускается это еще не баг.
Возможно в вашем приложение при запуске перехватывается событие и вы записываете например логин пользователя. Но при запуске этого теста такого пользователя нет и вы пытаетесь передать что то как массив, например роли пользователя, а в итоге получаете скаляр. И возникает ошибка.

У вас работают тесты из коробки? То есть при инициализации Ии? Если да, то скорее всего что то не так в настройках приложения, тестов.

Аватара пользователя
Chelobaka
Сообщения: 201
Зарегистрирован: 2018.06.01, 09:54

Re: не проходит API тест

Сообщение Chelobaka » 2019.11.12, 10:08

Еще заметил что тесты у вас конектятся к 2 разным БД.

Код: Выделить всё

Opening DB connection: pgsql:host=host;port=5432;dbname=database'
  [yii\db\Connection::open] 'Opening DB connection: pgsql:host=fschool_db;port=5432;dbname=fschool'
Возможно что то тут не так.

nds
Сообщения: 12
Зарегистрирован: 2017.09.05, 07:57

Re: не проходит API тест

Сообщение nds » 2019.11.12, 14:27

проблема была совсем детская: в кофиге приложения компонент 'db' подключался через require_once и соответственно при вызове второго метода теста в db был true. Поменял на require все заработало

Ответить