Apa itu Pengujian BDD? Contoh Kerangka

Apa itu Pengujian BDD (Perkembangan Berbasis Perilaku)?

Pengujian BDD (Pengembangan berbasis perilaku). adalah teknik pengembangan perangkat lunak tangkas dan merupakan perpanjangan dari TDD, yaitu Test Driven Development. Di BDD, kasus uji ditulis dalam bahasa alami yang bahkan dapat dibaca oleh non-programmer.

Bagaimana Pengujian BDD bekerja?

Anggaplah Anda ditugaskan untuk membuat modul Transfer Dana di aplikasi Net Banking.

Ada beberapa cara untuk mengujinya

  1. Transfer Dana harus dilakukan jika saldo di rekening sumber mencukupi
  2. Transfer Dana akan dilakukan jika rincian rekening tujuan sudah benar
  3. Transfer Dana harus dilakukan jika password transaksi / kode rsa / otentikasi keamanan untuk transaksi yang dimasukkan oleh pengguna sudah benar
  4. Transfer Dana harus dilakukan meskipun hari libur bank
  5. Transfer Dana harus dilakukan pada tanggal yang akan datang sebagaimana ditentukan oleh pemegang rekening

The Skenario Uji menjadi lebih rumit dan kompleks saat kita mempertimbangkan fitur tambahan seperti jumlah transfer X untuk interval Y hari/bulan, hentikan jadwal transfer saat jumlah total mencapai Z, dan seterusnya

Kecenderungan umum pengembang adalah mengembangkan fitur dan menulis kode pengujian kemudian. Seperti yang terlihat pada kasus di atas, Uji Kasus pengembangan untuk kasus ini rumit dan pengembang akan menundanya pengujian sampai rilis, pada saat itu dia akan melakukan pengujian yang cepat tetapi tidak efektif.

Untuk mengatasi permasalahan ini (Behavior Driven Development) maka dibentuklah BDD. Itu membuat seluruh proses pengujian menjadi mudah bagi pengembang

Di BDD, apapun yang Anda tulis harus masuk Diberikan-Kapan-Lalu Langkah. Mari kita perhatikan contoh yang sama di atas di BDD

Given that a fund transfer module in net banking application has been developed
And I am accessing it with proper authentication
WhenI shall transfer with enough balance in my source account
Or I shall transfer on a Bank Holiday
Or I shall transfer on a future date
And destination a/c details are correct
And transaction password/rsa code / security authentication for the transaction is correct
And press or click send button
Then amount must be transferred
And the event will be logged in log file

Bukankah menulis, membaca, dan memahaminya mudah? Ini mencakup semua kemungkinan uji kasus untuk modul transfer dana dan dapat dengan mudah dimodifikasi untuk mengakomodasi lebih banyak kasus. Selain itu, lebih seperti menulis dokumentasi untuk modul transfer dana.

Apa itu Pengujian REST API?

Karena REST telah menjadi gaya yang cukup populer untuk membangun API saat ini, mengotomatiskan kasus pengujian REST API bersama dengan kasus pengujian UI menjadi sama pentingnya. Jadi pada dasarnya, REST ini Pengujian API melibatkan pengujian tindakan CRUD (Buat-Baca-Perbarui-Hapus) dengan masing-masing metode POST, GET, PUT, dan DELETE.

Apa itu Berperilaku?

Berperilaku adalah salah satu yang populer Python Kerangka uji BDD.

Mari kita lihat bagaimana fungsi Behave:

File fitur ditulis oleh Analis Bisnis / Sponsor Anda / siapa pun yang memiliki skenario perilaku Anda di dalamnya. Ini memiliki format bahasa alami yang mendeskripsikan fitur atau bagian dari fitur dengan contoh representatif dari hasil yang diharapkan

Langkah-langkah Skenario ini dipetakan dengan implementasi langkah tertulis Python.

Dan secara opsional, ada beberapa kontrol lingkungan (kode untuk dijalankan sebelum dan sesudah langkah, skenario, fitur, atau keseluruhan pertandingan pengambilan gambar).

Mari kita mulai menyiapkan kerangka uji otomasi dengan Behave:

Menyiapkan Kerangka Pengujian BDD Berperilaku Windows

instalasi:

Pengaturan Proyek:

  • Buat Proyek Baru
  • Buat Struktur Direktori berikut:

Pengaturan Proyek

File Fitur:

Jadi mari kita buat file fitur kita Sample_REST_API_Testing.fitur memiliki fitur untuk Melakukan operasi CRUD pada layanan 'posting'.

Dalam contoh kita, saya telah menggunakan http://jsonplaceholder.typicode.com/ posting contoh Layanan REST.

Contoh skenario POST

Scenario: POST post example ->Here we are considering creating new post item using 'posts' service
Given: I set post posts API endpoint ->This is prerequisite for the test which is setting URL of posts service
When: I set HEADER param request content type as "application/json."
And set request body
And send POST HTTP request ->This is actual test step of sending a post request
Then: Then I receive valid HTPP response code 201 
And Response body "POST" is non-empty-> This is verification of response body	

Demikian pula, Anda dapat menulis Skenario lainnya sebagai berikut:

Pengaturan Proyek

Sample_REST_API_Testing.fitur

Feature: Test CRUD methods in Sample REST API testing framework

Background:
	Given I set sample REST API url

Scenario: POST post example
  Given I Set POST posts api endpoint
 When I Set HEADER param request content type as "application/json." 
    And Set request Body
 And Send a POST HTTP request 
 Then I receive valid HTTP response code 201
    And Response BODY "POST" is non-empty. 


Scenario: GET posts example
  Given I Set GET posts api endpoint "1"
  When I Set HEADER param request content type as "application/json." 
	And Send GET HTTP request
  Then I receive valid HTTP response code 200 for "GET." 
	And Response BODY "GET" is non-empty


Scenario: UPDATE posts example
  Given I Set PUT posts api endpoint for "1"
  When I Set Update request Body
	And Send PUT HTTP request
  Then I receive valid HTTP response code 200 for "PUT." 
	And Response BODY "PUT" is non-empty


Scenario: DELETE posts example
  Given I Set DELETE posts api endpoint for "1"
  When I Send DELETE HTTP request
  Then I receive valid HTTP response code 200 for "DELETE." 

Langkah Implementasi

Sekarang, untuk langkah-langkah fitur yang digunakan dalam skenario di atas, Anda dapat menulis implementasinya Python file di direktori "langkah".

Kerangka kerja berperilaku mengidentifikasi fungsi Langkah oleh dekorator yang cocok dengan predikat file fitur. Misalnya, Predikat yang diberikan dalam Skenario file Fitur mencari fungsi langkah yang dekoratornya “diberikan”. Pencocokan serupa terjadi untuk Kapan dan Kemudian. Namun dalam kasus 'Tetapi', 'Dan', fungsi Langkah mengambil dekorator sama seperti langkah sebelumnya. Misalnya, Jika 'Dan' muncul untuk Diberikan, dekorator fungsi langkah yang cocok adalah @diberikan.

Misalnya, langkah POST dapat diimplementasikan sebagai berikut:

@when (u'I Set HEADER param request content type as "{header_conent_type}"')
Mapping of When, here notice “application/json” is been passed from feature file for "{header_conent_type}” . This is called as parameterization


def step_impl (context, header_conent_type):
This is step implementation method signature

request_headers['Content-Type'] = header_conent_type
Step implementation code, here you will be setting content type for request header

Demikian pula implementasi langkah-langkah lain pada file step python akan terlihat seperti ini:

Langkah Implementasi

sample_step_implementation.py

from behave import given, when, then, step
import requests

api_endpoints = {}
request_headers = {}
response_codes ={}
response_texts={}
request_bodies = {}
api_url=None

@given(u'I set sample REST API url')
def step_impl(context):
    global api_url
    api_url = 'http://jsonplaceholder.typicode.com'

# START POST Scenario
@given(u'I Set POST posts api endpoint')
def step_impl(context):
    api_endpoints['POST_URL'] = api_url+'/posts'
    print('url :'+api_endpoints['POST_URL'])

@when(u'I Set HEADER param request content type as "{header_conent_type}"')
def step_impl(context, header_conent_type):
    request_headers['Content-Type'] = header_conent_type

#You may also include "And" or "But" as a step - these are renamed by behave to take the name of their preceding step, so:
@when(u'Set request Body')
def step_impl(context):
    request_bodies['POST']={"title": "foo","body": "bar","userId": "1"}

#You may also include "And" or "But" as a step - these are renamed by behave to take the name of their preceding step, so:
@when(u'Send POST HTTP request')
def step_impl(context):
    # sending get request and saving response as response object
    response = requests.post(url=api_endpoints['POST_URL'], json=request_bodies['POST'], headers=request_headers)
    #response = requests.post(url=api_endpoints['POST_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts
    # extracting response text
    response_texts['POST']=response.text
    print("post response :"+response.text)
    # extracting response status_code
    statuscode = response.status_code
    response_codes['POST'] = statuscode

@then(u'I receive valid HTTP response code 201')
def step_impl(context):
    print('Post rep code ;'+str(response_codes['POST']))
    assert response_codes['POST'] is 201
# END POST Scenario

# START GET Scenario
@given(u'I Set GET posts api endpoint "{id}"')
def step_impl(context,id):
    api_endpoints['GET_URL'] = api_url+'/posts/'+id
    print('url :'+api_endpoints['GET_URL'])

#You may also include "And" or "But" as a step - these are renamed by behave to take the name of their preceding step, so:
@when(u'Send GET HTTP request')
def step_impl(context):
    # sending get request and saving response as response object
    response = requests.get(url=api_endpoints['GET_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts
    # extracting response text
    response_texts['GET']=response.text
    # extracting response status_code
    statuscode = response.status_code
    response_codes['GET'] = statuscode

@then(u'I receive valid HTTP response code 200 for "{request_name}"')
def step_impl(context,request_name):
    print('Get rep code for '+request_name+':'+ str(response_codes[request_name]))
    assert response_codes[request_name] is 200

@then(u'Response BODY "{request_name}" is non-empty')
def step_impl(context,request_name):
    print('request_name: '+request_name)
    print(response_texts)
    assert response_texts[request_name] is not None
# END GET Scenario

#START PUT/UPDATE
@given(u'I Set PUT posts api endpoint for "{id}"')
def step_impl(context,id):
    api_endpoints['PUT_URL'] = api_url + '/posts/'+id
    print('url :' + api_endpoints['PUT_URL'])

@when(u'I Set Update request Body')
def step_impl(context):
    request_bodies['PUT']={"title": "foo","body": "bar","userId": "1","id": "1"}

@when(u'Send PUT HTTP request')
def step_impl(context):
    # sending get request and saving response as response object  # response = requests.post(url=api_endpoints['POST_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts
    response = requests.put(url=api_endpoints['PUT_URL'], json=request_bodies['PUT'], headers=request_headers)
    # extracting response text
    response_texts['PUT'] = response.text
    print("update response :" + response.text)
    # extracting response status_code
    statuscode = response.status_code
    response_codes['PUT'] = statuscode
#END PUT/UPDATE

#START DELETE
@given(u'I Set DELETE posts api endpoint for "{id}"')
def step_impl(context,id):
    api_endpoints['DELETE_URL'] = api_url + '/posts/'+id
    print('url :' + api_endpoints['DELETE_URL'])

@when(u'I Send DELETE HTTP request')
def step_impl(context):
    # sending get request and saving response as response object
    response = requests.delete(url=api_endpoints['DELETE_URL'])
    # response = requests.post(url=api_endpoints['POST_URL'], headers=request_headers) #https://jsonplaceholder.typicode.com/posts
    # extracting response text
    response_texts['DELETE'] = response.text
    print("DELETE response :" + response.text)
    # extracting response status_code
    statuscode = response.status_code
    response_codes['DELETE'] = statuscode
#END DELETE

Menjalankan Tes

Sekarang, kita sudah selesai dengan bagian pengembangan skrip pengujian, jadi mari kita jalankan pengujian kita:

Jalankan perintah berikut pada command prompt untuk menjalankan file fitur kami

C: \Program\Python\Python37>berperilaku -f cantik C:\ \fitur\fitur_file_folder\Sample_REST_API_Testing.fitur

Ini akan menampilkan hasil eksekusi tes sebagai berikut:

Menjalankan Tes

Tampilan laporan di konsol

Mari kita lihat satu hal keren lagi di sini.

Karena pengguna selalu lebih suka melihat hasil tes dalam format yang lebih mudah dibaca dan rapi, mari buat laporan dalam format HTML dengan bantuan Allure.

Laporan

Pertama, Anda perlu menginstal pemformat Allure Behave [https://docs.qameta.io/allure-report/]:

Dan sekarang jalankan perintah berikut:

Untuk laporan

>berperilaku -f json -o Sample_REST_API_Testing.fitur

> daya tarik melayani

Ini akan menghasilkan laporan hasil tes Anda dalam format yang rapi dan informatif seperti ini:

Laporan

Laporan Uji dalam Format HTML

Laporan Uji dalam Format HTML

Laporan Uji menampilkan hasil Skenario individual

Ringkasan

  • BDD adalah pengembangan yang didorong oleh perilaku. Ini adalah salah satu teknik pengembangan perangkat lunak tangkas.
  • REST telah menjadi gaya yang cukup populer untuk membangun API saat ini, dan mengotomatiskan kasus pengujian REST API bersama dengan kasus pengujian UI menjadi sama pentingnya.
  • BDD memiliki format bahasa alami yang mendeskripsikan fitur atau bagian fitur dengan contoh representatif dari hasil yang diharapkan
  • Kerangka kerja berperilaku mengidentifikasi fungsi Langkah oleh dekorator yang cocok dengan predikat file fitur
  • Contoh Kerangka Pengujian BDD: 1) Cucumber 2) SpecFlow 3) Quantum 4) JBehave 5) Codeception