Rumah > pembangunan bahagian belakang > Tutorial Python > Panduan untuk ujian unit python dengan unittest dan pytest

Panduan untuk ujian unit python dengan unittest dan pytest

William Shakespeare
Lepaskan: 2025-02-19 08:57:13
asal
823 orang telah melayarinya

A Guide to Python Unit Testing with unittest and pytest

Artikel ini menerangkan kepentingan ujian perisian dan mengapa anda perlu memberi perhatian kepadanya. Kami akan belajar bagaimana untuk merancang ujian unit dan bagaimana menulis ujian unit python. Khususnya, kami akan meneroka dua kerangka ujian unit yang paling biasa digunakan di Python: Unittest dan Pytest.

mata utama

    Ujian unit adalah bahagian penting dalam pembangunan perisian, yang membolehkan pemaju menguji komponen atau unit tertentu program untuk memastikan ia berjalan seperti yang diharapkan. Rangka kerja ujian unit popular di Python termasuk Unittest dan Pytest.
  • Ujian unit yang direka dengan baik harus cepat, bebas, berulang, boleh dipercayai dan bernama dengan baik. Mod "Penyediaan, Pelaksanaan, Penegasan (AAA)" sering digunakan untuk menganjurkan ujian unit, memisahkan persediaan, pelaksanaan, dan pengesahan.
  • Rangka Kerja Unittest adalah sebahagian daripada Perpustakaan Standard Python dan diilhamkan oleh Junit, rangka kerja ujian unit di Jawa. Ia menggunakan kaedah penegasan khas dan memerlukan ujian ditulis sebagai kaedah kelas yang diwarisi dari kelas Unittest.Testcase.
  • Rangka kerja PYTest membolehkan ujian kompleks dengan kod kurang, menyokong suite ujian unittest, dan menyediakan lebih daripada 800 pemalam luaran. Tidak seperti Unittest, Pytest menggunakan kaedah penegasan python biasa untuk menjadikannya lebih mudah dan lebih intuitif.
  • Walaupun ujian unit mempunyai banyak kelebihan, harus diingat bahawa ujian hanya dapat membuktikan kewujudan kecacatan, tetapi bukan ketiadaan kecacatan. Walaupun semua ujian berlalu, ia tidak dapat membuktikan bahawa sistem perisian tidak mempunyai kesilapan.

Pengenalan kepada ujian perisian

Ujian perisian adalah proses memeriksa tingkah laku produk perisian untuk menilai dan mengesahkan bahawa mereka mematuhi spesifikasi. Produk perisian mungkin mengandungi beribu -ribu baris kod dan beratus -ratus komponen yang berfungsi bersama. Jika garis kod tidak berfungsi dengan betul, ralat boleh menyebarkan dan menyebabkan kesilapan lain. Oleh itu, untuk memastikan bahawa program berjalan seperti yang diharapkan, ia mesti diuji.

Oleh kerana perisian moden boleh menjadi agak rumit, terdapat pelbagai tahap ujian untuk menilai aspek yang berbeza dari ketepatan. Menurut sukatan pelajaran asas ujian iSTQB, terdapat empat tahap ujian perisian:

    ujian unit: menguji baris kod tertentu
  1. ujian integrasi: integrasi ujian antara pelbagai unit
  2. ujian sistem: Uji keseluruhan sistem
  3. ujian penerimaan: periksa sama ada ia memenuhi objektif perniagaan
Artikel ini akan membincangkan ujian unit, tetapi sebelum masuk ke dalamnya, saya ingin memperkenalkan prinsip penting dalam ujian perisian.

Ujian hanya boleh membuktikan kewujudan kecacatan, tetapi tidak dapat membuktikan ketiadaan kecacatan.

-

iSTQB CTFL Syllabus 2018

Dengan kata lain, walaupun semua ujian yang anda jalankan tidak menunjukkan sebarang kegagalan, ia tidak akan membuktikan bahawa sistem perisian anda bebas daripada kesilapan, atau kes ujian lain tidak akan menemui sebarang kelemahan dalam tingkah laku perisian anda.

Apakah ujian unit?

Ini adalah tahap ujian pertama, juga dikenali sebagai ujian komponen. Dalam bahagian ini, satu komponen perisian diuji. Bergantung pada bahasa pengaturcaraan, unit perisian mungkin kelas, fungsi, atau kaedah. Sebagai contoh, jika anda mempunyai kelas Java yang dipanggil aritmeticoperations yang mengandungi pelbagai dan membahagikan kaedah, ujian unit kelas aritmetik perlu untuk menguji tingkah laku yang betul dari kaedah membiak dan membahagikan.

Ujian unit biasanya dilakukan oleh penguji perisian. Untuk menjalankan ujian unit, penguji perisian (atau pemaju) perlu mengakses kod sumber kerana kod sumber itu sendiri adalah objek yang diuji. Oleh itu, kaedah ujian perisian ini yang secara langsung menguji kod sumber dipanggil ujian kotak putih.

Anda mungkin tertanya -tanya mengapa anda perlu bimbang tentang ujian perisian dan sama ada ia berbaloi. Di bahagian seterusnya, kami akan menganalisis motivasi di sebalik sistem perisian ujian.

mengapa anda perlu melakukan ujian unit

Kelebihan utama ujian perisian ialah meningkatkan kualiti perisian. Kualiti perisian adalah penting, terutamanya di dunia di mana perisian mengendalikan semua jenis perkara dalam aktiviti harian kami. Meningkatkan kualiti perisian masih menjadi matlamat yang terlalu samar -samar. Mari cuba untuk menggambarkan dengan lebih baik apa yang kita panggil kualiti perisian. Menurut ISO/IEC Standard 9126-1 ISO 9126, kualiti perisian termasuk faktor berikut:

  • Kebolehpercayaan
  • Fungsi
  • kecekapan
  • Ketersediaan
  • Pengekalkan
  • porability

Jika anda memiliki sebuah syarikat, maka anda harus mempertimbangkan dengan teliti aktiviti ujian perisian kerana ia akan mempengaruhi perniagaan anda. Sebagai contoh, pada bulan Mei 2022, Tesla teringat 130,000 kereta kerana masalah dengan sistem infotainment kenderaan. Masalah ini kemudian diselesaikan melalui kemas kini perisian yang diedarkan "di udara". Kegagalan ini telah menyebabkan masa dan wang kepada syarikat dan juga menyebabkan masalah bagi pelanggan, kerana mereka tidak dapat menggunakan kereta mereka untuk seketika. Perisian ujian tidak memerlukan wang, tetapi syarikat juga boleh menjimatkan berjuta -juta sokongan teknikal.

Ujian unit memberi tumpuan kepada memeriksa bahawa perisian berjalan dengan betul, yang bermaksud memeriksa bahawa pemetaan antara input dan output dilakukan dengan betul. Sebagai aktiviti ujian peringkat rendah, ujian unit membantu mengenal pasti kesilapan awal supaya mereka tidak menyebarkannya ke tahap sistem perisian yang lebih tinggi.

Kelebihan ujian unit lain termasuk:

  • Integrasi mudah: Lebih mudah untuk menyelesaikan masalah integrasi dengan memastikan semua komponen berfungsi secara bebas.
  • Kurangkan regresi kod: Dengan sejumlah besar kes ujian, lebih mudah untuk mencari masalah jika beberapa pengubahsuaian kepada kod sumber pada masa akan datang akan menyebabkan masalah.
  • Disediakan Dokumentasi: Dengan menguji pemetaan yang betul antara input dan output, ujian unit menyediakan dokumentasi tentang cara menggunakan kaedah atau kelas yang diuji.

Strategi ujian reka bentuk

Sekarang mari kita lihat cara merancang strategi ujian.

Definisi Skop Ujian

Sebelum mula merancang strategi ujian anda, terdapat soalan penting untuk dijawab. Bahagian sistem perisian apa yang ingin anda uji?

Ini adalah isu utama, kerana ujian menyeluruh adalah mustahil. Oleh itu, anda tidak boleh menguji semua kemungkinan input dan output, tetapi anda harus mengutamakan ujian berdasarkan risiko yang terlibat.

Beberapa faktor perlu dipertimbangkan apabila menentukan skop ujian:

  • Risiko: Apakah akibat perniagaan akan berlaku jika ralat mempengaruhi komponen ini?
  • Masa: Berapa lama anda mahu produk perisian siap? Adakah anda mempunyai tarikh akhir?
  • Bajet: Berapa banyak wang yang anda sanggup melabur dalam aktiviti ujian?

Sebaik sahaja anda telah menentukan skop ujian (menentukan apa yang harus anda uji dan apa yang anda tidak patut menguji), anda boleh membincangkan ciri -ciri yang harus dimiliki oleh ujian unit yang baik.

Ciri -ciri ujian unit

  • Cepat. Ujian unit kebanyakannya dilakukan secara automatik, yang bermaksud mereka perlu cepat. Ujian unit perlahan lebih cenderung dilangkau oleh pemaju kerana mereka tidak memberikan maklum balas segera.
  • bebas. Ujian unit adalah bebas mengikut definisi. Mereka menguji unit kod individu dan tidak bergantung pada faktor luaran (seperti fail atau sumber rangkaian).
  • berulang. Ujian unit dilaksanakan berulang kali dan hasilnya mesti konsisten dari masa ke masa.
  • boleh dipercayai. Ujian unit akan gagal hanya jika terdapat ralat dalam sistem yang diuji. Perintah di mana persekitaran atau ujian dilaksanakan tidak boleh menjadi penting.
  • dengan betul dinamakan. Nama ujian harus memberikan maklumat yang relevan mengenai ujian itu sendiri.

Langkah hilang sebelum menyelidiki ujian unit di Python. Bagaimanakah kita mengatur ujian untuk menjadikannya bersih dan boleh dibaca? Kami menggunakan corak yang dipanggil penyediaan, pelaksanaan, dan pernyataan (AAA).

mod AAA

Corak Penyediaan, Pelaksanaan, dan Penegasan (AAA) adalah strategi yang sama untuk menulis dan menganjurkan ujian unit. Ia berfungsi seperti berikut:

  • Dalam fasa penyediaan, tetapkan semua objek dan pembolehubah yang diperlukan untuk ujian.
  • Seterusnya, semasa fasa pelaksanaan, fungsi/kaedah/kelas yang akan diuji dipanggil.
  • Akhirnya, dalam fasa penegasan, kami mengesahkan keputusan ujian.

Strategi ini menyediakan cara yang bersih untuk menganjurkan ujian unit dengan memisahkan semua bahagian utama ujian (persediaan, pelaksanaan, dan pengesahan). Di samping itu, ujian unit lebih mudah dibaca kerana mereka semua mengikuti struktur yang sama.

Ujian unit di Python: Unittest atau Pytest?

Kami kini akan membincangkan dua kerangka ujian unit yang berbeza di Python. Kedua -dua kerangka ini tidak tercemar dan pittest.

Pengenalan Unittest

Perpustakaan piawai Python mengandungi rangka kerja ujian unit yang paling unittest. Rangka kerja ini diilhamkan oleh Junit, yang merupakan rangka kerja ujian unit di Jawa.

Seperti yang dinyatakan dalam dokumentasi rasmi, Unittest menyokong beberapa konsep penting yang akan kita sebutkan dalam siaran ini:

  • kes ujian, ini adalah satu unit ujian
  • Suite ujian, ini adalah satu set kes ujian yang dilaksanakan bersama
  • pelari ujian, yang merupakan komponen yang mengendalikan pelaksanaan dan hasil semua kes ujian

Unittest mempunyai cara sendiri untuk menulis ujian. Khususnya, kita perlukan:

  1. menulis ujian kami sebagai kaedah kelas yang mewarisi dari kelas Unittest.Testcase
  2. Gunakan kaedah penegasan khas

Sejak Unittest telah dipasang, kami sudah bersedia untuk menulis ujian unit pertama kami!

ujian unit menulis menggunakan Unittest

Katakan kita mempunyai kelas BankAccount:

import unittest

class BankAccount:
  def __init__(self, id):
    self.id = id
    self.balance = 0

  def withdraw(self, amount):
    if self.balance >= amount:
      self.balance -= amount
      return True
    return False

  def deposit(self, amount):
    self.balance += amount
    return True
Salin selepas log masuk
Salin selepas log masuk

Kami tidak dapat mengeluarkan wang yang melebihi jumlah deposit yang tersedia, jadi mari menguji jika kod sumber kami mengendalikan keadaan ini dengan betul.

Dalam fail python yang sama, kita boleh menambah kod berikut:

class TestBankOperations(unittest.TestCase):
    def test_insufficient_deposit(self):
      # Arrange
      a = BankAccount(1)
      a.deposit(100)
      # Act
      outcome = a.withdraw(200)
      # Assert
      self.assertFalse(outcome)
Salin selepas log masuk
Salin selepas log masuk

Kami mencipta kelas yang dipanggil TestBankOperations yang merupakan subclass of Unittest.testcase. Dengan cara ini, kami membuat kes ujian baru.

Di kelas ini, kita menentukan fungsi ujian tunggal yang kaedahnya bermula dengan ujian. Ini penting kerana setiap kaedah ujian mesti bermula dengan ujian perkataan.

kami mengharapkan kaedah ujian ini untuk mengembalikan palsu, yang bermaksud operasi gagal. Untuk menegaskan hasilnya, kami menggunakan kaedah penegasan khas yang dipanggil AsseCsionFalse ().

Kami sudah bersedia untuk melakukan ujian. Mari jalankan arahan ini pada baris arahan:

python -m unittest example.py
Salin selepas log masuk
Salin selepas log masuk

di sini, contoh.py adalah nama fail yang mengandungi semua kod sumber. Output sepatutnya kelihatan seperti ini:

<code>.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK</code>
Salin selepas log masuk
Salin selepas log masuk

sangat bagus! Ini bermakna ujian kami berjaya. Sekarang mari kita lihat bagaimana output kelihatan ketika ada kegagalan. Kami menambah ujian baru ke kelas sebelumnya. Mari cuba mendepositkan jumlah negatif, yang pastinya mustahil. Adakah kod kita akan menangani keadaan ini?

Ini adalah kaedah ujian baru kami:

  def test_negative_deposit(self):
    # Arrange
    a = BankAccount(1)
    # Act
    outcome = a.deposit(-100)
    # Assert
    self.assertFalse(outcome)
Salin selepas log masuk
Salin selepas log masuk

kita boleh menggunakan mod terperinci Unittest untuk melaksanakan ujian ini dengan menggunakan bendera -v:

python -m unittest -v example.py
Salin selepas log masuk
Salin selepas log masuk

output berbeza sekarang:

<code>test_insufficient_deposit (example.TestBankOperations) ... ok
test_negative_deposit (example.TestBankOperations) ... FAIL

======================================================================
FAIL: test_negative_deposit (example.TestBankOperations)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 35, in test_negative_deposit
    self.assertFalse(outcome)
AssertionError: True is not false

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)</code>
Salin selepas log masuk
Salin selepas log masuk

Dalam kes ini, logo terperinci memberi kita lebih banyak maklumat. Kami tahu bahawa test_negative_deposit gagal. Khususnya, AssertionError memberitahu kita bahawa hasil yang diharapkan harus palsu, tetapi benar tidak palsu, yang bermaksud bahawa kaedah itu kembali benar.

Rangka Kerja Unittest menyediakan kaedah penegasan yang berbeza mengikut keperluan kita:

  • AssertEqual (x, y), uji sama ada x == y adalah benar
  • assertraises (exception_type), periksa sama ada pengecualian khusus telah dibangkitkan
  • assertisNone (x), uji sama ada x tidak ada
  • assertin (x, y), uji sama ada x dalam y

Sekarang kita mempunyai pemahaman asas tentang cara menulis ujian unit menggunakan kerangka unittest, mari kita lihat satu lagi rangka kerja python yang dipanggil pytest.

Pengenalan kepada Pytest

Rangka Kerja PyTest adalah rangka kerja ujian unit python yang mempunyai beberapa ciri yang berkaitan:

  • ia membolehkan ujian kompleks dengan kod kurang
  • ia menyokong suite ujian unittest
  • Ia menawarkan lebih daripada 800 plugin luaran

Sejak PYTest tidak dipasang secara lalai, kita mesti memasangnya terlebih dahulu. Perhatikan bahawa Pytest memerlukan Python 3.7.

Pasang pytest

Memasang pytest sangat mudah. Anda hanya perlu menjalankan arahan berikut:

import unittest

class BankAccount:
  def __init__(self, id):
    self.id = id
    self.balance = 0

  def withdraw(self, amount):
    if self.balance >= amount:
      self.balance -= amount
      return True
    return False

  def deposit(self, amount):
    self.balance += amount
    return True
Salin selepas log masuk
Salin selepas log masuk

kemudian periksa bahawa semuanya dipasang dengan betul dengan menaip:

class TestBankOperations(unittest.TestCase):
    def test_insufficient_deposit(self):
      # Arrange
      a = BankAccount(1)
      a.deposit(100)
      # Act
      outcome = a.withdraw(200)
      # Assert
      self.assertFalse(outcome)
Salin selepas log masuk
Salin selepas log masuk

output sepatutnya kelihatan seperti ini:

python -m unittest example.py
Salin selepas log masuk
Salin selepas log masuk

sangat bagus! Mari tulis ujian pertama menggunakan PYTest.

ujian unit menulis menggunakan pytest

kami akan menggunakan kelas BankAccount yang kami tulis sebelum ini dan kami akan menguji kaedah yang sama seperti dahulu. Dengan cara ini, lebih mudah untuk membandingkan usaha yang diperlukan untuk menulis ujian menggunakan kedua -dua kerangka ini.

untuk menggunakan pytest untuk ujian, kita perlukan:

  • Buat direktori dan letakkan fail ujian kami ke dalamnya.
  • Menulis ujian kami dalam fail yang namanya bermula dengan test_ atau berakhir dengan _test.py. Pytest akan mencari fail -fail ini dalam direktori semasa dan subdirektori.

jadi kami membuat fail bernama test_bank.py dan masukkannya ke dalam folder. Inilah fungsi ujian pertama kami seperti:

<code>.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK</code>
Salin selepas log masuk
Salin selepas log masuk

Seperti yang anda perhatikan, satu -satunya perubahan berbanding dengan versi Unittest ialah bahagian menegaskan. Di sini kita menggunakan kaedah penegasan python biasa.

sekarang kita dapat melihat fail test_bank.py:

  def test_negative_deposit(self):
    # Arrange
    a = BankAccount(1)
    # Act
    outcome = a.deposit(-100)
    # Assert
    self.assertFalse(outcome)
Salin selepas log masuk
Salin selepas log masuk

Untuk menjalankan ujian ini, mari kita buka command prompt dalam folder yang mengandungi fail test_bank.py. Kemudian, jalankan perintah berikut:

python -m unittest -v example.py
Salin selepas log masuk
Salin selepas log masuk

output akan kelihatan seperti ini:

<code>test_insufficient_deposit (example.TestBankOperations) ... ok
test_negative_deposit (example.TestBankOperations) ... FAIL

======================================================================
FAIL: test_negative_deposit (example.TestBankOperations)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 35, in test_negative_deposit
    self.assertFalse(outcome)
AssertionError: True is not false

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)</code>
Salin selepas log masuk
Salin selepas log masuk

Dalam kes ini, kita dapat melihat betapa mudahnya menulis dan melaksanakan ujian. Selain itu, kita dapat melihat bahawa kita menulis kurang kod daripada Unittest. Hasil ujian juga mudah difahami.

mari kita terus melihat ujian yang gagal!

Kami menggunakan kaedah kedua yang kami tulis sebelum ini, yang dipanggil test_negative_deposit. Kami refactor bahagian menegaskan dan hasilnya adalah seperti berikut:

pip install -U pytest
Salin selepas log masuk

Kami menjalankan ujian seperti dahulu, yang sepatutnya menjadi output:

pytest --version
Salin selepas log masuk

dengan menghuraikan output kita boleh membaca 2 item yang dikumpulkan, yang bermaksud bahawa dua ujian telah dilakukan. Tatal ke bawah dan kita dapat melihat ralat berlaku semasa menguji kaedah test_negative_deposit. Khususnya, kesilapan berlaku semasa menilai dakwaan. Di samping itu, laporan itu juga menyatakan bahawa nilai pemboleh ubah hasil adalah benar, yang bermaksud bahawa kaedah deposit mengandungi kesilapan.

Sejak Pytest menggunakan kata kunci penegasan python lalai, kita dapat membandingkan apa -apa output yang kita dapat dengan pembolehubah lain yang menyimpan hasil yang diharapkan. Semua ini tidak memerlukan kaedah penegasan khas.

Kesimpulan

Semua dalam artikel ini, kami memperkenalkan asas -asas ujian perisian. Kami mendapati mengapa ujian perisian adalah penting dan mengapa semua orang perlu menguji kod mereka. Kami membincangkan ujian unit dan bagaimana untuk mereka bentuk dan melaksanakan ujian unit mudah di Python.

Kami menggunakan dua kerangka python yang dipanggil Unittest dan Pytest. Kedua -duanya mempunyai ciri -ciri yang berguna, dan mereka adalah dua rangka kerja yang paling biasa digunakan dalam ujian unit Python.

Akhirnya, kita melihat dua kes ujian asas untuk memberi anda idea bagaimana menulis ujian sebagai persiapan, pelaksanaan, dan corak penegasan.

Saya harap saya telah meyakinkan anda tentang pentingnya ujian perisian. Pilih rangka kerja, seperti Unittest atau Pytest, dan mula ujian - kerana usaha tambahan adalah berbaloi!

Jika anda suka artikel ini, anda juga boleh mencari yang berikut berguna:

  • ujian cypress: Panduan untuk menjalankan aplikasi web
  • bagaimana untuk menguji komponen reaksi dengan jest
  • belajar ujian akhir-ke-akhir dengan dalang
  • 3 cara untuk terus menguji secara bebas tangan
  • Pengenalan semula Jenkins: Gunakan paip untuk ujian automatik

Soalan Lazim Mengenai Ujian Unit Python

Apakah ujian unit di Python? Ujian unit di Python adalah teknik ujian perisian di mana satu unit atau komponen program diuji diuji untuk memastikan setiap unit berfungsi seperti yang diharapkan.

Mengapa ujian unit penting dalam pembangunan python? Ujian unit membantu memastikan ketepatan komponen individu dalam program Python. Ia membantu untuk mengesan kesilapan awal, menyediakan jaring yang selamat untuk perubahan kod, dan menyokong pemeliharaan kod.

Bagaimana menulis ujian unit di Python? Ujian unit di Python sering ditulis menggunakan modul terbina dalam. Anda membuat kelas ujian yang diwarisi dari Unittest.Testcase dan menulis kaedah ujian dalam kelas ini. Kaedah ujian biasanya bermula dengan "ujian".

apa rangka kerja lain yang boleh saya gunakan untuk ujian unit python selain Unittest? Ya, selain Unittest ada rangka kerja ujian Python yang popular seperti Pytest dan Hidung. Rangka kerja ini menyediakan ciri -ciri dan sintaks yang berbeza, yang membolehkan pemaju memilih yang paling sesuai dengan keperluan mereka.

Apakah peranan perlawanan dalam ujian unit python? Perlawanan adalah cara untuk menetapkan prasyarat dalam Python dan membersihkan selepas ujian. Mereka membantu memastikan ujian bebas dan boleh berjalan secara bebas.

Apakah liputan ujian dan mengapa ia penting? Perlindungan ujian mengukur peratusan kod asas ujian anda dilaksanakan. Ia membantu mengenal pasti kod yang belum diuji dan memastikan ujian anda komprehensif, dengan itu mengurangkan kemungkinan kesilapan yang ditemui.

Apakah amalan terbaik untuk menulis ujian unit yang berkesan di Python? Ya, beberapa amalan terbaik termasuk menulis ujian bebas dan terpencil, menggunakan nama kaedah ujian deskriptif, dan situasi sempadan ujian. Di samping itu, cuba dapatkan liputan ujian yang baik dan jalankan ujian dengan kerap.

Atas ialah kandungan terperinci Panduan untuk ujian unit python dengan unittest dan pytest. 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