Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Masalah dan penyelesaian biasa dalam amalan ujian unit PHP

Masalah dan penyelesaian biasa dalam amalan ujian unit PHP

PHPz
PHPzasal
2024-05-06 12:42:011161semak imbas

Soalan Lazim dalam ujian unit PHP: Ujian kebergantungan luaran: Menggunakan rangka kerja mengejek (seperti Mockery) untuk mencipta kebergantungan palsu dan menegaskan interaksi mereka. Ujian ahli persendirian: Gunakan API refleksi seperti ReflectionMethod untuk mengakses ahli persendirian atau gunakan pengubah kebolehlihatan ujian seperti @protected. Ujian interaksi pangkalan data: Sediakan dan sahkan keadaan pangkalan data menggunakan rangka kerja ujian pangkalan data seperti DbUnit. Pengujian API/Perkhidmatan Web Luaran: Gunakan perpustakaan klien HTTP untuk mensimulasikan interaksi, menggunakan pelayan setempat atau stub dalam persekitaran ujian.

PHP 单元测试实践中的常见问题与解决方案

Soalan Lazim dalam Pengujian Unit PHP

Soalan 1: Bagaimana hendak unit kod ujian dengan kebergantungan luaran?

Penyelesaian: Gunakan rangka kerja mengejek seperti PHPUnit's Mockery atau Prophecy yang membolehkan anda mencipta objek pergantungan palsu dan membuat penegasan tentang interaksi mereka.

use Prophecy\Prophet;

class UserRepoTest extends \PHPUnit\Framework\TestCase
{
    public function testFetchUser(): void
    {
        $prophet = new Prophet();
        $cache = $prophet->prophesize(Cache::class);

        $userRepo = new UserRepo($cache->reveal());

        $actualUser = $userRepo->fetchUser(1);

        $cache->get(1)->shouldHaveBeenCalled();
        $this->assertEquals($expectedUser, $actualUser);
    }
}

Soalan 2: Bagaimana untuk menguji kaedah atau harta peribadi?

Penyelesaian: Gunakan API refleksi (seperti ReflectionClass dan ReflectionMethod) yang membolehkan anda mengakses ahli peribadi. Walau bagaimanapun, ia boleh membuat ujian sukar untuk dikekalkan. ReflectionClassReflectionMethod),允许你访问私有成员。然而,它可能会使测试难以维护。

另一种解决方案是使用测试特定的可见性修饰符,例如 PHPUnit 的 @protected

Penyelesaian lain ialah menggunakan pengubah keterlihatan khusus ujian, seperti @protected PHPUnit.

class UserTest extends \PHPUnit\Framework\TestCase
{
    public function testPasswordIsSet(): void
    {
        $user = new User();

        $reflector = new ReflectionClass($user);
        $property = $reflector->getProperty('password');

        $property->setAccessible(true);
        $property->setValue($user, 'secret');

        $this->assertEquals('secret', $user->getPassword());
    }
}
Soalan 3: Bagaimana untuk menguji interaksi pangkalan data?

Penyelesaian:

Gunakan rangka kerja ujian pangkalan data seperti DbUnit PHPUnit atau Penegasan DBAL Doktrin, yang membolehkan anda menetapkan dan mengesahkan keadaan pangkalan data.

use PHPUnit\DbUnit\TestCase;

class PostRepoTest extends TestCase
{
    protected function getConnection(): Connection
    {
        return $this->createDefaultDBConnection();
    }

    public function testCreatePost(): void
    {
        $dataset = $this->createXMLDataSet(__DIR__ . '/initial-dataset.xml');
        $this->getDatabaseTester()->setDataSet($dataset);
        $this->getDatabaseTester()->onSetUp();

        $post = new Post(['title' => 'My First Post']);
        $postRepo->persist($post);
        $postRepo->flush();

        $this->assertTrue($this->getConnection()->getRowCount('posts') === 1);
    }
}
Soalan 4: Bagaimana untuk menguji kod yang bergantung pada API luaran atau perkhidmatan web?

Penyelesaian:

Gunakan perpustakaan klien HTTP untuk mensimulasikan interaksi dengan perkhidmatan luaran. Dalam persekitaran ujian, anda boleh menggunakan pelayan setempat atau stub. 🎜rreeee

Atas ialah kandungan terperinci Masalah dan penyelesaian biasa dalam amalan ujian unit PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn