RikkeiSoft Co. Ltd.,

Auto test with PHPUnit

Created by Oanh Nguyen

Nội dung

  1. PHPUnit là gì?
  2. Bắt đầu với PHPUnit
  3. Tự động test trước khi git commit
  4. TDD là cái gì?

Hello

me
  • Mình là một developer
  • Muốn tạo nhưng thứ tốt nhất = code
  • Không muốn sản phẩm của mình có bug
  • Nhưng mình ngại test!

Tại sao?

  • Tốn thời gian
  • Setup phức tạp
  • Lặp đi lặp lại => nhàm chán

Giải pháp?

PHPUnit

Amazing

PHPUnit là gì?

“PHPUnit is a unit testing framework for the PHP programming language. It is an instance of the xUnit architecture for unit testing frameworks. PHPUnit was created by Sebastian Bergmann and its development is hosted on GitHub.”
-- Wikipedia --

PHPUnit là ...

  • A unit testing framework for PHP
  • An open source software

Unit?

  • Meters is a unit
  • Micrometers is a unit
  • And kilometers is also a unit

WTF

Bắt đầu với PHPUnit

Sử dụng Composer

Composer logo

phpunit.xml & phpunit.xml.dist

Độ ưu tiên: phpunit.xml > phpunit.xml.dist

          
<?xml version="1.0" encoding="utf-8"?>

  
  
    
    
  

  
  
    
      tests
    
  

  
  
    
      vendor
      bin
    
    
      src
    
  

          
    

Bootstrap

          
<?php
// tests/bootstrap.php

// Enable Composer autoloader
$autoloader = require dirname(__DIR__) . '/vendor/autoload.php';
// Register test classes
$autoloader->addPsr4('YourOrg\\YourProject\\Tests\\', __DIR__);

          
    

Conventions

  1. Tên class test sẽ bắt đầu bằng Test và thường giống với tên class cần test
  2. Tên file giống với tên class test
  3. Class test phải kế thừa từ class PHPUnit_Framework_TestCase
  4. Method test cũng bắt đầu bằng test

Làm thế nào để

test không sót case?

Lập bảng matrix test case

Table matrix

Sử dụng @dataProvider

          
<?php
//...
/**
 * Test `matchingAccount()` method
 *
 * @param string  $username
 * @param string  $password
 * @param boolean $expected
 * @dataProvider dataTestMatchingAccount
 */
public function testMatchingAccount($username, $password, $expected)
{
    $result = $this->authenticator->matchingAccount($username, $password);
    $this->assertSame($expected, $result);
}

/**
 * Data for test `matchingAccount()` method
 *
 * @return array
 */
public function dataTestMatchingAccount()
{
    return [
        ['',       '',         false],
        ['',       'abc12345', false],
        ['oanhnn', '',         false],
        ['oanhnn', 'abc12345', true],
        ['oanhnn', '12345678', false],
        ['oanh',   '',         false],
        ['oanh',   'abc12345', false],
        ['oanh',   '12345678', false],
    ];
}
          
    

Chạy PHPUnit

Tự động test trước khi git commit

1. Tạo file .git/hooks/pre-commit với nội dung:

          
#!/usr/bin/php
<?php
// Hook configuration
$project = 'Training PHPUnit 01';

// Tell the commiter what the hook is doing
echo PHP_EOL;
echo "Starting unit tests...\n";

// Execute project unit tests
exec('phpunit', $output, $returnCode);

// if the build failed, output a summary and fail
if ($returnCode !== 0) {
  // find the line with the summary; this might not be the last
  while (($minimalTestSummary = array_pop($output)) !== null) {
    if (strpos($minimalTestSummary, 'Tests:') !== false) {
      break;
    }
  }

  // output the status and abort the commit
  echo "Test suite for '{$project}' failed:\n";
  echo $minimalTestSummary;
  echo PHP_EOL;
  exit(1);
}

echo "All tests for '{$project}' passed.\n";
echo PHP_EOL;
exit(0);
          
    

Tự động test trước khi git commit (tiếp)

2. Thêm quyền thực thi và commit thử

          
$ cd /path/to/project
$ vi .git/hooks/pre-commit
$ chmod a+x .git/hooks/pre-commit
$ git commit -am "Added changes"

Starting unit tests...
All tests for 'Training PHPUnit 01' passed.

[master xxxxxxx] Added changes
1 files changed, 1 insertions(+), 1 deletions(-)
          
    
Amazing

Tuyệt hơn nếu nó thành quy trình sản xuất phần mềm

TDD là gì?

“Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) automated test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards.”
-- Wikipedia --

TDD là ...

  • A software development process
  • Sử dụng auto test
  • Code chạy được, chạy đúng => chuẩn hóa

TDD gồm các bước

  1. Tạo script test
  2. Chạy test và chỉnh sửa script test theo đúng spec
  3. Viết code chương trình
  4. Chạy test
  5. Chỉnh sửa lại code để sửa lỗi
  6. Lặp lại các bước khi có thêm yêu cầu

Tổng kết

  1. PHPUnit là gì?
  2. Bắt đầu với PHPUnit
  3. Tự động test trước khi git commit
  4. TDD là cái gì?

Q & A

THE END

- PHPUnit site
- Wikipedia about PHPUnit
- Tutorial about PHPUnit of Juan Tremini