Pengujian Pengendali Untuk Python 2

Artikel Pengujian Unit Lokal untuk Python menjelaskan cara menjalankan pengujian unit untuk aplikasi Anda. Meskipun pengujian unit sangat bagus untuk menguji unit kode yang terpisah, integrasi unit kode tersebut adalah yang membuat aplikasi Anda berjalan. Jadi, pengujian integrasi juga sama pentingnya.

Untuk aplikasi App Engine, pengendali permintaan adalah titik integrasi yang penting. Meskipun aplikasi WSGI merutekan permintaan ke pengendali yang tepat, pengendali itu sendiri memproses data permintaan dan menghasilkan respons (baca selengkapnya tentang Pengendali Permintaan). Pengendali permintaan adalah objek Python normal seperti fungsi atau class lainnya, yang membuatnya mudah digunakan dalam pengujian otomatis. Namun, karena aplikasi WSGI menggabungkannya seperti shell, kita akan menggunakan shell serupa dalam pengujian.

WebTest

Untuk pengujian, kita akan menggunakan framework WebTest. WebTest adalah library yang memberi Anda antarmuka sederhana untuk menguji aplikasi berbasis WSGI, dan juga pengendali permintaan. Hal ini dilakukan dengan menggabungkan aplikasi WSGI ke dalam aplikasi pengujian khusus yang kemudian dapat digunakan untuk pengujian. WebTest memungkinkan Anda berinteraksi dengan pengendali tanpa lingkungan App Engine lengkap; Anda dapat dengan mudah mengeluarkan permintaan dan mengubah lingkungan permintaan. Responsnya juga memiliki antarmuka yang mudah untuk diuji. Anda tidak perlu menggunakan WebTest, namun pastinya akan membuat hidup Anda jauh lebih mudah.

Sebelum dapat memulai, instal WebTest di komputer lokal atau di mana pun Anda ingin menjalankan pengujian pengendali. Petunjuknya dapat ditemukan di http://webtest.pythonpaste.org/#installation

Menguji Pengendali "Halo Dunia" Sederhana

Mari kita mulai dengan menguji pengendali "Halo Dunia!" sederhana yang merespons permintaan pengguna dengan balasan teks biasa. Respons pengendali adalah "Halo Dunia!" dan jenis kontennya adalah "text/plain":

import webapp2
import webtest

class HelloWorldHandler(webapp2.RequestHandler):
   def get(self):
       # Create the handler's response "Hello World!" in plain text.
       self.response.headers['Content-Type'] = 'text/plain'
       self.response.out.write('Hello World!')

Selanjutnya, buat kasus pengujian dan inisialisasi aplikasi pengujian yang menggunakan pengendali Anda:

...
class AppTest(unittest.TestCase):
    def setUp(self):
        # Create a WSGI application.
        app = webapp2.WSGIApplication([('/', HelloWorldHandler)])
        # Wrap the app with WebTest’s TestApp.
        self.testapp = webtest.TestApp(app)

    # Test the handler.
    def testHelloWorldHandler(self):
        response = self.testapp.get('/')
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.normal_body, 'Hello World!')
        self.assertEqual(response.content_type, 'text/plain')

Seperti yang Anda lihat, WebTest memungkinkan Anda membuat permintaan GET dengan panggilan get() sederhana (metode permintaan lain memiliki metode yang serupa). Nilai yang ditampilkan adalah objek respons yang dapat digunakan untuk menguji kode status, isi, jenis konten, dan banyak lagi — lihat Halaman beranda WebTest untuk deskripsi mendetail tentang semua hal yang dapat Anda lakukan.

Membuat Pengujian Pengendali yang Menggunakan Layanan App Engine

Sekarang, mari kita lihat cara menguji pengendali yang menggunakan layanan App Engine. Artinya, sekarang kita harus menangani dua komponen yang dapat memengaruhi pengujian: pengendali dan layanan yang kita gunakan. Seperti yang dijelaskan dalam artikel Pengujian Unit Lokal untuk Python, cara terbaik untuk menangani layanan dalam pengujian adalah dengan menggunakan testbed.

Contoh berikut menggunakan Memcache, tetapi prinsipnya sama untuk layanan lain seperti Datastore atau Task Queue.

Pengendali yang kami uji meng-cache kunci dan nilai yang diberikan. Perhatikan bahwa kita mengurai kedua nilai dari parameter permintaan.

from google.appengine.api import memcache
from google.appengine.ext import testbed
import webapp2
import webtest

class CacheHandler(webapp2.RequestHandler):
  def post(self):
    key = self.request.get('key')
    value = self.request.get('value')
    memcache.set(key, value)

Dalam pengujian, seperti sebelumnya, buat aplikasi terlebih dahulu lalu gabungkan dengan WebTest. Selain itu, aktifkan instance Testbed dan pastikan untuk menonaktifkannya setelah pengujian.

...
class AppTest(unittest.TestCase):

  def setUp(self):
    app = webapp2.WSGIApplication([('/cache/', CacheHandler)])
    self.testapp = webtest.TestApp(app)
    self.testbed = testbed.Testbed()
    self.testbed.activate()

  def tearDown(self):
     self.testbed.deactivate()

  def testCacheHandler(self):
    # First define a key and value to be cached.
    key = 'answer'
    value = '42'
    self.testbed.init_memcache_stub()
    params = {'key': key, 'value': value}
    # Then pass those values to the handler.
    response = self.testapp.post('/cache/', params)
    # Finally verify that the passed-in values are actually stored in Memcache.
    self.assertEqual(value, memcache.get(key))

Menyiapkan Framework Pengujian

Anda dapat menyiapkan framework pengujian jika menginginkannya. Pengujian untuk pengendali yang menggunakan WebTest dapat dijalankan seperti pengujian unit Anda untuk App Engine. Satu-satunya perbedaan adalah Anda harus memastikan bahwa Anda telah menginstal WebTest.