Mengapa untuk proyek baru saya mengambil Robot Framework

Baru-baru ini saya mengubah proyek - saya datang ke pengembangan baru, di mana sebelum saya tidak ada pengujian, baik manual atau otomatis. Pelanggan tidak memaksakan persyaratan pada toolkit (kecuali bahwa itu adalah Python), jadi saya membuat pilihan saya sendiri. Pada artikel ini, saya akan menjelaskan mengapa dalam kondisi seperti itu saya memilih Robot Framework. Dan pada akhirnya akan ada beberapa contoh yang ditulis khusus untuk artikel yang menggambarkan apa yang kita bicarakan.

gambar

Saya telah melakukan otomatisasi pengujian selama lebih dari 10 tahun, dan sekitar tiga dari mereka berinteraksi dengan Kerangka Robot.

Seperti yang saya sebutkan di atas, belum lama ini saya datang ke proyek baru, di mana saya mulai menguji otomatisasi dari awal. Saya tidak bisa memberi tahu Anda tentang proyek - NDA. Saya hanya mencatat bahwa ini adalah alat otomatisasi keren, yang di masa depan harus menghemat banyak sumber daya manusia. Itu dibangun dari microservices. Sejauh ini, pekerjaan saya menyangkut empat dari mereka, tetapi di masa depan saya akan memperluas kegiatan saya ke orang lain - semuanya bermuara pada fakta bahwa saya hanya memiliki 8 jam kerja sehari. Semua butuh waktu.

Kurangnya pengujian dalam kasus proyek ini identik dengan kurangnya alat yang direkomendasikan. Sebagai bagian dari tumpukan Python, saya memiliki kebebasan memilih. Dan saya memanfaatkannya.

Mengapa Kerangka Robot?


Saya pikir saya dapat dikaitkan dengan penggemar Kerangka Robot. Tampak bagi saya bahwa hampir semuanya dapat dilakukan.

Pada proyek lain, perusahaan menggunakan pytest. Namun, menurut pendapat saya, itu tidak memiliki kemampuan seperti itu, karena dibatasi oleh kemampuan Python. Anda hanya menulis kode Python dan perhatikan bahwa Anda mengharapkan nilai tertentu dalam variabel tersebut. Menurut selera saya, ini sederhana tetapi terlalu abstrak. Banyak yang telah ditinggalkan oleh pengembang, yang harus menambahkan semua fitur yang berguna dengan tangan. Kerangka Robot melakukannya sendiri. Berikut adalah empat poin yang layak Anda bawa ke proyek Anda.

Fleksibilitas


Kerangka Robot itu sendiri ditulis dalam Python (yaitu, semua yang dapat dilakukan Python), dan untuk itu ada banyak perpustakaan yang dibuat oleh komunitas, yang sangat memperluas berbagai masalah yang harus dipecahkan.

Di bawah Kerangka Robot, Anda dapat dengan mudah menulis perpustakaan Anda sendiri, mengintegrasikannya dengan hampir semua hal, dan semuanya akan segera bekerja. Tidak diperlukan kruk atau sepeda.
Dan di samping itu, Kerangka Robot memungkinkan Anda untuk menulis tes parametrik (templat), yang sangat mempercepat pekerjaan alat otomatisasi.

Bahasa Rusia dalam ujian


Salah satu poin mendasar adalah bahwa kata kunci (analog dari metode konvensional dalam Kerangka Robot, yang karena alasan tertentu secara historis disebut demikian) dapat ditulis dalam bahasa Rusia. Akibatnya, teks-teks ujian tentu saja jauh dari bahasa sastra, tetapi sekilas menjadi jelas apa yang terjadi di sana. Pertama-tama, ini diperlukan bukan oleh pengembang akhir, tetapi, misalnya, oleh para pemangku kepentingan. Mereka dapat secara mandiri membuka tes dan melihat apa yang sebenarnya terjadi di sana: "Pilih elemen acak dari ...", dll.

Memberi tag


Kerangka Robot berfungsi baik dengan tag. Anda tidak hanya dapat menjalankan tes dengan tag tertentu, tetapi juga menganalisis laporan dengan bantuan mereka. File log berisi statistik tentang tag, berdasarkan mana Anda dapat mengambil tindakan jika Anda berpikir tentang pengaturan tag sebelumnya.

Dengan mudah, Anda tidak perlu menulis semua tag dalam kain panjang di setiap tes, tetapi Anda dapat menanamkan tes dalam struktur pohon. Dalam kasus saya, terlihat seperti ini: tingkat pertama adalah layanan mikro, yang kedua adalah jenis tes, yang ketiga adalah tes itu sendiri (lebih mudah untuk menempatkan file init yang berisi tag untuk apa yang tertanam di dalamnya).

Saya membuat tag untuk setiap layanan Microsoft, setiap pendekatan pengujian (tes asap, tes CRUD, integrasi, dll.). Saya dapat menjalankan tes dari jenis tertentu atau hanya untuk layanan tertentu. Saya juga menandai jenis fungsi - daftar atau detail. Dan jika produk yang bertanggung jawab atas fungsi daftar "istirahat" dalam produk, semua tes dengan tag ini akan berubah menjadi merah, terlepas dari di mana mereka berada dan apa hubungannya.

Dengan tag saya ikat autotests ke Jira. Saat bug dari pelacak ditutup, dan pengujian dari merah berubah menjadi hijau, kami masih memiliki riwayat tentang apa yang sebenarnya telah berubah. Beberapa bulan kemudian, jika tes berubah menjadi merah lagi, kita dapat melihat langkah-langkah apa yang diambil untuk memperbaiki masalah terakhir kali, dan bahkan berasumsi hal itu menyebabkan pemutaran bug yang berulang.

Tag khusus lain yang saya tambahkan untuk bug tidak penting. GitLab tidak memungkinkan kita untuk melakukan apa pun dengan perakitan jika setidaknya satu tes gagal. Ini logis - sebelum semua bug diperbaiki, kami tidak dapat merilis produk atau bahkan sprint mingguan. Tetapi kami memiliki bug dengan prioritas rendah dan tidak signifikan. Bagi mereka, saya memilih tag yang memungkinkan Kerangka Robot untuk tidak menjatuhkan seluruh unit, kecuali tes khusus ini (tes dengan tag ini) gagal.

Log yang bagus


Analisis log merupakan bagian integral dari pengujian. Apa pun yang terjadi pada saat tes dijalankan, Robot Framework benar-benar menulis segalanya. Sampai pada titik saya harus menulis bungkus khusus yang menyembunyikan login dan kata sandi dari log untuk terhubung ke database.

Perincian seperti itu membantu untuk memahami lebih cepat apa alasan crash tes - apakah sistem yang diuji bekerja dengan tidak benar atau ada sesuatu yang tidak diperhitungkan dalam pengujian dan perlu diperbaiki? Jawaban atas pertanyaan ini tidak selalu jelas. Kesalahan pengembang dan penguji didistribusikan 50/50.
Di alat lain - di pytest yang sama - Anda dapat membuat log detail yang sama. Tapi di sana tugas untuk membuatnya terletak pada pengembang yang menulis tes. Dia perlu berpikir tentang jenis entri log apa yang benar-benar dibutuhkan.

Apa yang ada di proyek sekarang


Sejak saya mulai menggunakan Kerangka Robot, beberapa bulan telah berlalu. Saat ini, Kerangka Robot telah menerapkan lebih dari 200 tes dan, seperti yang disebutkan di atas, ada integrasi dengan GitLab, yang membantu memeriksa perubahan yang dibuat pada produk yang dikembangkan (uji kasus dengan pengidentifikasi yang memungkinkan Anda untuk mengikat autotest agar disimpan dalam testrail).

Untuk menghitung cakupan, saya menulis sebuah utilitas yang mengambil daftar API backend dari Swagger dan membandingkannya dengan apa yang diuji. Dengan demikian, kami memiliki pemahaman yang jelas tentang cakupan saat ini. Sebagai contoh, kita tahu bahwa hari ini layanan mikro ini tercakup secara keseluruhan, sedangkan yang lain tercakup 98%. Dan setelah menambahkan fungsionalitas baru yang belum tercermin dalam pengujian, cakupan turun. Oleh karena itu, Anda dapat merencanakan sprint berikutnya untuk diterapkan oleh saya.

Secara alami, proyek ini terus berkembang. Sebagai contoh, sekarang kami menggunakan server tiruan ( kolega saya sudah menulis di Habré tentang apa itu dan mengapa itu diperlukan).

Sekarang untuk berlatih


Contoh di atas dirancang khusus untuk artikel untuk menggambarkan ide-ide di atas. Jika Anda ingin bereksperimen dengan contoh-contoh ini sendiri, mereka semua diposting di repositori kami .

Contoh tes paling sederhana


Mari kita mulai dengan tes paling sederhana pada Kerangka Robot.

Dalam contoh di bawah ini, sesi pertama kali dibuat untuk sumber daya tertentu yang jelas dapat diakses (dalam kasus kami, en.wikipedia.org/wiki ). Dengan memanggil Dapatkan root (/), kami memeriksa kode status 200.

*** Settings *** Documentation  smoke-. Library RequestsLibrary *** Variables *** ${base_url} https://en.wikipedia.org/wiki ${url} / *** Test Cases ***   Wiki Create session conn ${base_url} disable_warnings=1 ${response} Get request conn ${url} Delete all sessions Should be equal ${response.status_code} ${200} 

Tes templat (parametrik)


Kerangka Robot memungkinkan Anda untuk membuat pola uji. Jika kami mentransfer tes dari contoh sebelumnya ke tampilan templat, kami dapat dengan mudah mengaturnya dengan menambahkan panggilan dengan argumen yang diperlukan. Sebagai contoh, mari kita periksa jawaban 200 untuk halaman-halaman dengan biografi para ilmuwan.

 *** Settings *** Documentation  smoke-.    . ...    . Library RequestsLibrary Test Setup   Test Teardown    Test Template Smoke- *** Variables *** ${base_url} https://en.wikipedia.org/wiki *** Test Cases ***      /Isaac_Newton      /Albert_Einstein      /Stephen_Hawking *** Keywords ***   Create session conn ${base_url} disable_warnings=1    Delete all sessions Smoke- [Arguments] ${url} ${response} Get request conn ${url} Should be equal ${response.status_code} ${200} 

Menandai dan membaca log


Kami terus meningkatkan tes paling sederhana.

Memiliki templat sebagai titik masuk tunggal, kami dapat dengan mudah menambahkan verifikasi tahun kelahiran ilmuwan. Dengan cara ini kami mengonfirmasi bahwa halaman yang dimuat menampilkan data yang benar.

Selain itu, dalam contoh di bawah ini, saya membungkus kata kunci yang ada dengan nama Rusia - untuk selera saya, jadi tesnya terdengar lebih organik. Sebagai seorang penguji, saya selalu kesal dengan metode yang disebut "seolah-olah dalam bahasa Inggris," tetapi benar-benar buta huruf. Itu selalu lebih baik untuk menulis dalam bahasa yang Anda tahu.

 *** Settings *** Documentation  smoke-.    . ...    . ...      . ...  . Library RequestsLibrary Test Setup   Test Teardown    Test Template Smoke- *** Variables *** ${base_url} https://en.wikipedia.org/wiki *** Test Cases ***      [Tags] Newton /Isaac_Newton 1642      [Tags] Einstein /Albert_Einstein 1879      [Tags] Hawking /Stephen_Hawking 1942     (  ) [Tags] Numbers /123456789 1899 *** Keywords ***   Create session conn ${base_url} disable_warnings=1    Delete all sessions Smoke- [Arguments] ${url} ${expected_word} ${response} Get request conn ${url} Should be equal ${response.status_code} ${200} ... msg=  GET ${url}    ,   200 .      ${response.text} ${expected_word}      [Arguments] ${text} ${expected_word} Should contain ${text} ${expected_word} msg=    ${expected_word}! 

Perhatikan [Tags] . Anda dapat menambahkan tag di sini, yang, seperti yang saya tulis di atas, akan membantu menilai masalah di tingkat laporan. Demikian pula, Force Tags dalam file Robot __init__. (Lihat contoh di repositori kami ) memungkinkan Anda untuk menetapkan tag untuk semua tes di direktori, termasuk yang bersarang. Jika pemberian tag dilakukan dengan benar, bahkan tanpa membaca nama tes itu sendiri dan tanpa merangkak ke dalam logikanya, kita dapat dengan tepat mengasumsikan bahwa itu tidak bekerja di proyek uji.

Lihatlah laporan pada peluncuran tes ini. Untuk lebih jelasnya, saya menambahkan tes yang akan menemukan kesalahan.

Laporan statistik adalah bagian terpentingnya.

gambar

Dalam contoh kami, pengujian dengan tag numbers tidak lulus sepenuhnya (kami memiliki 1 dari 1, tetapi dalam kehidupan nyata akan ada, misalnya, 17 dari 20). Dapat diasumsikan bahwa masalahnya ada di halaman ini.

Tag membantu menjalankan tes secara selektif. Untuk menjalankan semua tes dengan tag tertentu di baris peluncuran, Anda harus menentukan:

 --include <tag> 

Bahkan operasi logis dengan tag didukung:

 -- include <tag>AND<tag> 

Misalnya, jika Anda ingin menjalankan hanya tes Asap untuk tes dengan tag angka, Anda harus menambahkan:

 --include smokeANDnumbers 

Tes tidak kritis


Mari kita beralih ke trik yang sangat menyederhanakan pekerjaan.

Setelah menandai pengujian dengan tag, Anda dapat menetapkan satu atau lebih dari itu sebagai "tidak penting". Pengujian dengan tag semacam itu masih akan menunjukkan kesalahan (jika ada), tetapi pada akhirnya, kesalahan ini tidak akan ditafsirkan sebagai "tidak valid". Saya menggunakan opsi ini ketika beberapa bug minor diperhitungkan, dimasukkan ke pelacak bug, tetapi belum diperbaiki. Tanpa itu, autotest yang termasuk dalam CI, setelah mendeteksi masalah yang diketahui, tidak akan memungkinkan Anda untuk merakit proyek, dan ini tidak selalu nyaman.

Tambahkan tes baru:

     (   ) [Tags] Letters Known /abcdefghi 1799 

Saat startup, tag yang ditambahkan didefinisikan sebagai "tidak kritis" menggunakan kunci:

 --noncritical Known 

Kata kunci dalam python


Dengan contoh berikut, saya akan mengilustrasikan cara menambahkan perpustakaan saya.

Buat kata kunci baru “Hasilkan array angka”. Tujuannya jelas (untuk ini saya suka nama Rusia).

 from random import randint from typing import List from robot.api.deco import keyword class ArrayGeneratorLibrary: ROBOT_LIBRARY_SCOPE = 'GLOBAL' @keyword("  ") def generate_array(self, length: int, minimal: int, maximal: int) -> List[int]: result = [] for i in range(int(length)): result.append(randint(int(minimal), int(maximal))) return result 

Kami menghubungkan perpustakaan dalam tes:

 Library libraries.ArrayGeneratorLibrary 

dan gunakan:

   ,   python. ${array}    ${5} ${2} ${8} Log to console ${array} 

Jangan lupa bahwa jika Anda memiliki struktur bersarang, Anda harus memisahkannya dengan titik-titik, seperti dalam contoh.
Trik lain: angka yang diteruskan dalam ${} diperlakukan sebagai int, bukan sebagai string!

Argumen sebaris


Hal lain yang menyenangkan adalah argumen bawaan, yang diberikan bukan pada akhir panggilan, seperti biasa, tetapi langsung di tubuhnya.

Untuk mengilustrasikannya, kami akan menulis wrapper untuk generator array yang dibuat di atas, yang memungkinkan penggunaan argumen bawaan:

  ${n} ,  ${from}  ${to} ${result}    ${n} ${from} ${to} [Return] ${result} 

Sekarang Anda dapat menulis seperti ini:

       . ${array}  5 ,  2  8 Log to console ${array} 

Substitusi bagian dari nama metode, masukkan dan loop python


Trik berikutnya yang sangat saya sukai tentang Kerangka Robot adalah penggantian bagian dari nama. Misalkan kita memiliki dua metode: satu memilih angka genap, yang lain ganjil.

      [Arguments] ${list} ${evens} Evaluate [i for i in $list if i % 2 == 0] [Return] ${evens}      [Arguments] ${list} ${odds} Evaluate [i for i in $list if i % 2 != 0] [Return] ${odds} 

Kata kunci Evaluate digunakan di atas memungkinkan Anda untuk mengeksekusi baris kode python "di sini". Harap dicatat, jika Anda tidak ingin mengganti seutas string dengan konten variabel, yaitu, meneruskan tautan ke sana, Anda harus menunjukkan nama variabel segera setelah tanda $ tanpa kurung kurawal!

Jadi, Anda dapat memanggil kedua metode, menggantikan bagian yang berbeda dari namanya:

     ,   . . ${types} Create list   ${array}  5 ,  12  28 FOR ${type} IN @{types} ${numbers} Run keyword  ${type}    ${array} log to console ${numbers} END 

Dekorator Metode


Ya, Robot Framework memungkinkan Anda untuk menulis dekorator untuk kata kunci lainnya!

Untuk menggambarkan fitur ini, kami menulis dekorator yang memilih angka negatif sebagai respons dari metode apa pun yang mengembalikan daftar.

     ,  [Arguments] ${keyword} @{args} &{kwargs} ${list} Run keyword ${keyword} @{args} &{kwargs} ${negs} Evaluate [i for i in $list if i < 0] [Return] ${negs} 

Harap dicatat:
@{args} semuanya adalah argumen yang tidak disebutkan namanya;
&{kwargs} semuanya bernama argumen.
Memiliki banyak ini, Anda dapat mengarahkan mereka, sebenarnya membuat dekorator.
Bekerja dengan dekorator akan terlihat seperti ini:

    ${negs}     ,     10 -5 5 log to console ${negs} 

Alih-alih sebuah kesimpulan


Dalam contoh di atas, saya menunjukkan fitur utama dari Kerangka Robot, yang membuat hidup jauh lebih mudah. Tetapi chip-nya tidak terbatas pada daftar ini.

Jika Anda memiliki pertanyaan, tulis di komentar. Kami akan memilih arah utama minat baca dan menjawab pertanyaan dengan kelanjutan teks.

Penulis artikel: Vladimir Vasyaev.

PS Kami menerbitkan artikel kami di beberapa situs Runet. Berlangganan ke halaman kami di VK , FB atau saluran Telegram untuk mencari tahu tentang semua publikasi kami dan berita Maxilect lainnya.

Source: https://habr.com/ru/post/id470924/


All Articles