Z
Z
zbender2014-01-22 13:42:57
Unit testing
zbender, 2014-01-22 13:42:57

What are the mistakes in my phpunit test writing style?

I write tests for models (that I don't develop) on phpunit. Little programming experience. I would like to get advice: how to improve the style of writing tests, what gross mistakes, what shortcomings, and so on.
Project in yii. For tests, a separate database (mongodb - a restore is periodically made with the main database). Test users with test data have been created on the main database (there are static users whose data does not change (used for methods of the get type), there are dynamic users (in tests they add, change, delete data, and most often these changes are not cleaned up after running tests, because they will not affect anything in the future)).
The parameters for the test are most often formed using the provider. Most often, a separate test checks a separate method of the model, and the provider passes various parameters for the method (full (or almost complete) coverage of the method code is provided).
Here is an example test:

public function testSend($params, $expResult, $userEmail, $expExceptionMsg) {
        // перезаходим под необходимым юзером
        self::changeUserID($userEmail);
        // здесь, если expExceptionMsg != null, то выставляется ожидаемое исключение
        self::setExpException($this, $expExceptionMsg);
          // выполняем метод который необходимо проверить
        $result = Chat::send($params);
        // при необходимости в ожидаемый результат подставляем непредсказуемые данные
        $expResult['date'] = $result['date'];
        $expResult['timestamp'] = $result['timestamp'];
        $expResult['index'] = $result['index'];

        $this->assertEquals($expResult, $result);
    }

And an example provider:
public function providerSend(){
          // из этих массивов затем формируется массив для провайдера

          // параметры для проверяемого метода
        $params = array();
        // логин пользователя под которым будет выполняться тест
        $userEmail = array();
          // ожидаемый результат
        $expResult = array();
       // ожидаемое исключение
        $expExceptionMsg = array();
                
        //------------- Test#0 ---------------------
        // отправка сообщения не участником чата
        
        $i = 0;
        $params[$i] = array(
            'chatId' => '42378423747',
            'text' => 'Сообщение, которое не отправится в чат',
        );
        $userEmail[$i] = '[email protected]';
        $expExceptionMsg[$i] = 'Access error';        
        
        //------------- Test#1 ---------------------
        // сообщение пользователя
        // $i определяет под каким номером будет тестовый случай в провайдере. 
       //к примеру если необходимо не выполнять какой-то тестовый случай, то можно
      // его закомментировать и сформируется корректный провайдер, но без него.
        $i++;
        $params[$i] = array(
            'chatId' => '42378423747',
            'text' => 'Тестовое сообщение',
        );
        $userEmail[$i] = '[email protected]';
        $expResult[$i] = array(
                'chatId' => $params[$i]['chatId'],
                'text' => $params[$i]['text'],
                'date' => 'Меняем в тесте',
                'timestamp' => 'Меняем в тесте',
                'from' => User::get(array('userId' => '529f06e2ecaa3c5b05000001')),
                'type' => GEMessage::GE_MESSAGE_TYPE_GENERAL,
                'index' => 'Меняем в тесте',
                'objects' => null,
            );
        
        //-------------  end   ---------------------
          
          // Здесь формируется массив для провайдера
        return self::returnProviderArray(array($params, $expResult, $userEmail, $expExceptionMsg));
    }

Here is how the provider is formed:
protected static function returnProviderArray($params) {
        $providerArray = array();
        foreach ($params[0] as $key => $value) {
            // массив параметров для одного теста
            $paramsArray = array();
            foreach ($params as $param) {
                // незаполненые параметры заполняем null
                if (!isset($param[$key]))
                    $param[$key] = null;
                $paramsArray[] = $param[$key];
            }
            $providerArray[] = $paramsArray;
        }
        return $providerArray;
    }

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question