Rumah > pembangunan bahagian belakang > tutorial php > PHP Master | Pengenalan kepada ujian objek mengejek

PHP Master | Pengenalan kepada ujian objek mengejek

William Shakespeare
Lepaskan: 2025-02-26 11:27:11
asal
728 orang telah melayarinya

PHP Master | An Introduction to Mock Object Testing

Titik utama ujian unit objek simulasi

    objek mock adalah pengganti yang digunakan dalam ujian unit untuk menggantikan objek sebenar, mensimulasikan tingkah laku yang berjalan objek sebenar. Simulasi objek berguna apabila kebergantungan objek tidak dilaksanakan atau bergantung kepada faktor -faktor yang sukar untuk disimulasikan.
  • Dalam ujian, objek mengejek dicipta dan disuntik ke dalam sistem untuk memenuhi kebergantungan, yang membolehkan pemaju mula menulis logik perniagaan.
  • Walaupun objek mock buatan tangan boleh digunakan pada mulanya, kerana keperluan ujian menjadi lebih kompleks, rangka kerja mock sebenar mungkin diperlukan. Rangka kerja simulasi boleh menjimatkan masa dan menghasilkan kod bersih.
  • Rangka Kerja Simulasi PHPUNIT adalah alat yang boleh digunakan untuk membuat objek mengejek untuk ujian. Proses ini melibatkan mengenal pasti objek untuk disimulasikan, menentukan kaedah yang akan disimulasikan, dan menentukan parameter dan nilai pulangan.
  • Objek simulasi digunakan terutamanya untuk ujian unit untuk mengasingkan sistem yang diuji. Mereka mensimulasikan tingkah laku yang berlari objek sebenar yang kompleks dan sangat berguna untuk menguji bagaimana modul tertentu aplikasi berinteraksi dengan modul lain.
Jika anda adalah sebahagian daripada pasukan pembangunan, kod anda biasanya bergantung kepada kod yang ditulis oleh rakan sepasukan anda. Tetapi bagaimana jika kod mereka tidak tersedia pada masa ini - sebagai contoh, rakan sepasukan anda belum selesai menulis? Atau, bagaimana jika kod yang anda perlukan memerlukan kebergantungan luaran lain yang sukar ditetapkan? Bagaimana jika anda tidak dapat menguji kod anda kerana faktor lain yang anda tidak dapat mengawal? Adakah anda akan melepak dan tidak melakukan apa -apa, menunggu pasukan anda selesai atau semuanya sudah siap? Sudah tentu tidak! Dalam artikel ini, saya akan menerangkan cara menulis kod untuk menyelesaikan masalah ketergantungan ini. Idealnya, anda memerlukan pengetahuan latar belakang tentang ujian unit, dan sudah ada artikel pengenalan yang sangat baik mengenai ujian unit yang ditulis oleh Michelle Saver di Sitepoint. Walaupun artikel ini tidak memerlukannya, sila lihat artikel saya yang lain mengenai ujian pangkalan data automatik.

kes objek simulasi

Seperti yang anda mungkin dapati, objek mengejek dapat menyelesaikan situasi rumit yang saya nyatakan dalam pengenalan. Tetapi apakah objek mengejek? Objek mock adalah objek pengganti yang menggantikan pelaksanaan sebenar objek sebenar. Mengapa anda mahukan objek pengganti dan bukannya objek sebenar? Objek mock digunakan untuk ujian unit untuk mensimulasikan tingkah laku yang berjalan objek sebenar dalam kes ujian. Dengan menggunakannya, fungsi objek yang anda lakukan akan lebih mudah untuk diuji. Berikut adalah beberapa situasi yang berguna semasa menggunakan objek mengejek:

  1. Pelaksanaan sebenar satu atau lebih kebergantungan objek

    belum dilaksanakan. Katakan tugas anda adalah untuk melakukan beberapa pemprosesan beberapa data dalam pangkalan data. Anda mungkin memanggil beberapa bentuk akses data ke objek atau repositori data, tetapi bagaimana jika pangkalan data belum ditetapkan? Bagaimana jika tiada data tersedia (saya telah menemui terlalu banyak kali) atau kod untuk menanyakan pangkalan data belum ditulis? Simulasi objek akses data mensimulasikan objek akses data sebenar dengan mengembalikan beberapa nilai yang telah ditetapkan. Ini menjimatkan anda dari beban menubuhkan pangkalan data, mencari data, atau kod menulis yang menanyakan pangkalan data.

  2. Pelaksanaan sebenar kebergantungan objek bergantung kepada faktor -faktor yang sukar untuk mensimulasikan. Katakan anda ingin mengira bilangan suka dan komen pada catatan Facebook pada waktu siang. Di manakah anda mendapat data? Akaun pemaju Facebook anda baru. Alamak, anda masih tidak mempunyai kawan! Bagaimana anda akan mensimulasikan suka dan komen? Simulasi objek menyediakan cara yang lebih baik untuk menyukai atau mengulas pada beberapa jawatan daripada masalah rakan sekerja anda. Jika anda ingin memaparkan data pada hari ke hari, bagaimanakah anda mensimulasikan semua operasi ini dalam jangka masa? Bagaimana dengan bulanan? Bagaimana jika sesuatu yang tidak dapat dibayangkan berlaku, apa yang perlu saya lakukan jika Facebook sedang turun? Objek mock boleh berpura -pura menjadi perpustakaan Facebook dan mengembalikan data yang anda perlukan. Anda tidak perlu melalui masalah yang saya sebutkan untuk memulakan tugas anda.

Objek simulasi dalam amalan

Sekarang kita tahu apa objek mengejek, mari kita lihat beberapa contoh praktikal. Kami akan melaksanakan ciri -ciri mudah yang disebut tadi, seperti mengira suka dan komen di jawatan Facebook. Kami akan bermula dengan ujian unit berikut untuk menentukan jangkaan kami tentang bagaimana objek akan dipanggil dan apakah nilai pulangannya:

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Jika anda menjalankan ujian ini, anda akan mendapat hasil yang gagal. Ini diharapkan kerana kami belum melaksanakan apa -apa lagi! Sekarang mari kita tulis pelaksanaan perkhidmatan. Sudah tentu, langkah pertama adalah mendapatkan data dari Facebook, jadi mari kita lakukan terlebih dahulu:

<?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Ujian ini juga akan gagal kerana objek Facebook kosong. Anda boleh memasukkan pelaksanaan sebenar dengan membuat contoh sebenar menggunakan ID Aplikasi Facebook, dan lain -lain, tetapi untuk apa? Kita semua tahu bahawa berbuat demikian akan menyebabkan anda menyimpang dari kesakitan tugas di tangan. Kita boleh mengelakkan ini dengan menyuntik objek mengejek! Cara menggunakan objek mock (sekurang -kurangnya dalam kes kami) adalah untuk membuat kelas dengan kaedah mendapatkan () dan mengembalikan nilai mock. Ini sepatutnya menipu pelanggan kita untuk memikirkan ia memanggil pelaksanaan objek sebenar apabila sebenarnya ia hanya dihina.

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    // test here
}

class MockFacebookLibrary
{
    public function get($id) {
        return array(
            // mock return from Facebook here
        );
    }
}
Salin selepas log masuk
Salin selepas log masuk
Sekarang kita mempunyai kelas mengejek, mari kita instanate contoh dan menyuntikkannya ke statusservice supaya kita dapat menggunakannya. Tetapi pertama, gunakan setter untuk mengemas kini statusservice untuk digunakan dengan perpustakaan Facebook:

<?php
class StatusService
{
    // other lines of code

    public function setFacebook($facebook) {
        $this->facebook = facebook;
    }
}
Salin selepas log masuk
suntikan mock facebook perpustakaan sekarang:

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ujian masih gagal, tetapi sekurang-kurangnya kita tidak lagi menerima kesilapan mengenai kaedah panggilan pada bukan objek. Lebih penting lagi, anda hanya menyelesaikan keperluan untuk memenuhi pergantungan ini. Anda kini boleh mula menulis logik perniagaan untuk tugas yang anda berikan dan lulus ujian.

<?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

pergi satu langkah lebih jauh: Gunakan rangka simulasi

Walaupun anda boleh menggunakan objek mock buatan tangan apabila anda mula -mula mula, maka, seperti yang saya dapati diri saya, kerana keperluan anda menjadi lebih kompleks, anda mungkin perlu menggunakan kerangka mock sebenar. Dalam artikel ini, saya akan menunjukkan cara menggunakan kerangka mock yang datang dengan phpunit. Dalam pengalaman saya, terdapat beberapa manfaat untuk menggunakan rangka kerja yang mengejek berbanding menggunakan objek mock yang ditulis secara manual:

  • anda boleh malas. Saya mendapati ini benar terutamanya apabila berurusan dengan kelas abstrak dengan banyak kaedah abstrak. Anda hanya boleh mensimulasikan beberapa kaedah kelas abstrak atau antara muka. Jika anda melakukan ini secara manual, anda perlu melaksanakan semua kaedah ini secara manual. Ia menjimatkan beberapa kerja menaip dan juga menyusun semula jenis ini;
  • anda boleh menulis kod bersih. Kebolehbacaan adalah kunci di sini. Simulasi berasaskan kerangka menjadikan ujian anda lebih mudah difahami kerana simulasi anda ditulis dalam ujian. Anda tidak perlu menatal ke bawah atau bertukar antara fail untuk melihat simulasi menulis sendiri yang ditulis di tempat lain. Bagaimana jika anda perlu memanggil objek mengejek beberapa kali dan mendapatkan hasil yang berbeza? Menggunakan simulasi berasaskan rangka kerja, kod boilerplate if-else yang diperlukan untuk melakukan ini sudah terkandung dengan baik. Oleh itu, lebih mudah difahami.

rangka kerja simulasi menggunakan phpunit

Mari fokus sekarang pada rangka kerja simulasi menggunakan phpunit, langkah -langkah sebenarnya sangat intuitif dan apabila anda dapat memahaminya, ia menjadi sifat kedua. Dalam bahagian ini, kami akan menggunakan rangka kerja simulasi PHPUNIT untuk membuat objek mengejek untuk kes contoh kami. Walau bagaimanapun, sebelum kita melakukan ini, komen atau memadam garis kod dalam ujian yang menggunakan objek mock buatan tangan kami. Kita perlu gagal terlebih dahulu supaya kita dapat lulus. Kemudian, kami akan menyuntik pelaksanaan simulasi baru.

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    // test here
}

class MockFacebookLibrary
{
    public function get($id) {
        return array(
            // mock return from Facebook here
        );
    }
}
Salin selepas log masuk
Salin selepas log masuk

Sahkan bahawa ujian gagal semasa menjalankan phpunit. Sekarang, fikirkan bagaimana kita boleh mensimulasikan objek secara manual dan kaedah yang kita mahu panggil. Apa yang kita buat?

  1. Langkah pertama adalah untuk mengenal pasti objek yang akan disimulasikan. Dalam fungsi contoh analisis di atas, kami mensimulasikan perpustakaan Facebook. Kami melakukan perkara yang sama seperti dalam langkah pertama.

  2. Sekarang kita telah menentukan kelas untuk dihina, kita mesti tahu kaedah di dalam kelas yang akan dihina, dan jika ada kaedah yang ada, tentukan parameter dan nilai pulangan. Templat asas yang saya gunakan dalam kebanyakan kes adalah kira -kira seperti berikut:

    1. Tentukan bilangan kali kaedah akan dipanggil (diperlukan).
    2. Tentukan nama kaedah (diperlukan).
    3. Tentukan parameter (pilihan) yang dijangkakan oleh kaedah.
    4. Nyatakan nilai pulangan (pilihan)

mari kita gunakan langkah -langkah yang disebutkan sekarang untuk ujian sampel kami.

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

selepas kami membuat objek Facebook mengejek sekali lagi, suntikannya ke dalam perkhidmatan kami sekali lagi:

<?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sekarang, anda harus lulus ujian lagi. Tahniah! Anda telah mula menguji dengan objek mengejek! Mudah -mudahan anda dapat memprogram dengan lebih berkesan dan yang paling penting menghilangkan halangan yang anda hadapi dalam kebergantungan masa depan.

Gambar dari Fotolia

(bahagian FAQ mengenai ujian objek mock harus ditambah di sini, kandungannya konsisten dengan bahagian FAQ dalam teks input, tetapi ia perlu sedikit menulis semula dan digilap untuk mengelakkan pertindihan)

Atas ialah kandungan terperinci PHP Master | Pengenalan kepada ujian objek mengejek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan