Sebagai seorang insinyur QA, saya mengembangkan sistem swa-uji. Menghadapi sejumlah masalah:
- Untuk setiap jenis pengujian, saya harus membuat pekerjaan saya sendiri di CI dan menjalankannya dengan tangan.
- Pengembang menolak untuk menjalankan kasus swa-uji.
- Ketidakmampuan menjalankan autotest dari mana saja pada perangkat.
- QA insinyur uji manual tidak bisa menjalankan autotes sendiri.
Oleh karena itu, saya memutuskan untuk membuat prototipe kecil bot untuk menjalankan tes otomatis, yang akan mencakup sebagian besar masalah yang dijelaskan di atas.
Deskripsi gagasan:Pengguna mengirimkan perintah yang diperlukan ke obrolan, meluncurkan build di sistem CI, sesuai dengan aturan yang ditentukan dalam konfigurasi. CI menjalankan autotest dengan tanda terbaik. Setelah dijalankan, skrip di dalam repositori tes menerima informasi tentang status build, mengumpulkan log dan mengirimkannya kembali ke pengguna dalam obrolan telegram.
Alat:Alat-alatnya- Bahasa Pemrograman - Python
- Kerangka Uji - Pytest
- Klien HTTP - Permintaan
- DataBase - SQLite3
- ORM - Peewee
- Sistem CI - Travis CI
Isi- Persiapan
- Pendaftaran Bot
- Mempersiapkan repositori tes
- Tes dan Penebangan
- Pembuatan laporan
- Konfigurasikan Travis CI
- Pengaturan bot
- Prinsip-prinsip bot
- Penempatan di Heroku
Pendaftaran Bot
Pertama-tama, kita perlu mendaftarkan telegram bot dan mendapatkan id uniknya, yang merupakan token. Untuk melakukan ini, tulis pesan / mulai ke bot @BotFather.
Tim utama kami adalah / newbot, dengan memasukkan yang kami akan diminta untuk datang dengan nama bot.
Tetapi ada satu aturan - nama harus diakhiri dengan bot. BotFather mengambil nama bot dan mengembalikan token Anda. Aktifkan bot dengan mulai mengobrol. Selanjutnya, Anda perlu mengirim permintaan API ke metode getUpdates.
https://api.telegram.org/bot{_}/getUpdates
Ingat hat_id yang diterima.
Mempersiapkan repositori tes
Selanjutnya, Anda perlu mengatur repositori dengan tes, atau menggunakan artikel yang
disiapkan sebelumnya .
Tes dan PenebanganBuat fungsi tes dan tandai dengan tanda terbaik - penuh, asap dan burung.
Penting untuk menambahkan logging ke pengujian kami dengan membuat file pytest.ini dan menambahkan panggilan ke metode info dari perpustakaan logging di fungsi tes.
File pytest.ini berisi template untuk log langsung dan file log.
Contoh uji import pytest import requests import logging @pytest.mark.full @pytest.mark.smoke def test_cat_facts(): query = {"animal_type": "cat", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.full @pytest.mark.smoke def test_dog_facts(): query = {"animal_type": "dog", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.full def test_horse_facts(): query = {"animal_type": "horse", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.bird def test_bird_facts(): query = {"animal_type": "bird", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200
pytest.ini [pytest] markers = smoke: for smoking testing full: for regression testing bird: facts only bird log_cli = 1 log_cli_level=INFO log_cli_format = %(asctime)s [%(levelname)8s] %(message)s log_cli_date_format='%Y-%m-%d %H:%M:%S' log_file = test_log.log log_file_level=INFO log_file_format= %(asctime)s [%(levelname)8s] %(message)s log_file_date_format='%Y-%m-%d %H:%M:%S'
Pembuatan laporanKami membuat skrip yang, setelah perakitan selesai, mengumpulkan informasi dari sistem CI dan mengirimkannya ke telegram chat, bersama dengan log.
Di dalam skrip, Anda perlu mengganti nilai TELEGRAM_BOT dan CHAT_ID dengan yang Anda terima sebelumnya.
Kode skrip import requests import os TRAVIS_TEST_RESULT = os.environ.get("TRAVIS_TEST_RESULT") TRAVIS_REPO_SLUG = os.environ.get("TRAVIS_REPO_SLUG") TRAVIS_BRANCH = os.environ.get("TRAVIS_BRANCH") TRAVIS_JOB_WEB_URL = os.environ.get("TRAVIS_JOB_WEB_URL") TRAVIS_COMMIT_MESSAGE = os.environ.get("TRAVIS_COMMIT_MESSAGE") TELEGRAM_TOKEN = "808619876:GHrtj9zs-KvKhhtWyu1YoxjtIikUYMGVjD8g" CHAT_ID = "272560060" if TRAVIS_TEST_RESULT != 0: build_status = "" else: build_status = "" TEXT = f" : {build_status} \n : {TRAVIS_REPO_SLUG} \n : {TRAVIS_BRANCH} \n Commit : {TRAVIS_COMMIT_MESSAGE} \n -: {TRAVIS_JOB_WEB_URL}" def send_message(): URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage" body = {'chat_id': CHAT_ID, 'text': TEXT} response = requests.post(url=URL, json=body) return response def send_file(): URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendDocument" body = {'chat_id': CHAT_ID} file = {"document": open("test_log.log")} response = requests.post(url=URL, data=body, files=file) return response send_message() send_file()
Skrip menggunakan variabel sistem dan menerima nilai dari Travis CI.
Jika nilai TRAVIS_TEST_RESULT tidak sama dengan nol, nilai diatur ke "Berhasil", fungsi send_message pertama kali diproses, yang mengirimkan informasi perakitan ke obrolan (nama repositori, cabang yang dipilih, nama komit yang digunakan, tautan ke log web), kemudian fungsi send_file yang mengirim file log.
Dalam repositori pengujian, tambahkan file konfigurasi - travis.yml. Di dalam kami menggambarkan saluran pipa di mana perakitan akan bekerja.
travis.yml language: python python: - "3.7" install: - pip install -r requirements.txt script: pytest -m smoke after_script: - python tg_command.py
Selanjutnya, kita perlu menggunakan repositori di GitHub untuk menambahkannya ke Travis CI.
Pengaturan TRAVIS_CI
Kami pergi ke
situs .
Masuk menggunakan akun GitHub Anda. Beralih ke tab Dasbor. Setelah sebelumnya membuka DevTools (Jaringan), di sub-tab Repositori di situs yang berlawanan dengan gudang tes, gerakkan penggeser - aktifkan unitnya. Di tab Jaringan (DevTools), permintaan aktif tiba, di pratinjau yang ada informasi tentang id repositori, nomor tersebut harus diingat (salin / tulis). Beralih ke situs di tab Pengaturan. Kami menyalin atau mengingat token - kami membutuhkannya.
Pengaturan bot
Pada artikel ini kita tidak akan berkutat pada analisis kode, Anda bisa melihatnya di
repositori . Sekarang penting bagi kita untuk memahami dasar-dasar topik, jadi mari kita lanjutkan untuk menyiapkan bot kami:
Di dalam repositori terdapat file-file:
- main.py - skrip bot;
- models.py - file dengan model untuk ORM;
- conf.ini - file dengan variabel konfigurasi;
- runtime.txt - memperbaiki nilai versi Python untuk Travis CI;
- procfile - setting untuk gunicorn;
- wsgi.py - file peluncuran aplikasi dengan gunicorn.
Untuk membuat bot Anda berfungsi, Anda perlu mengganti data di conf.ini, yaitu:
- travis_token - menunjukkan token yang diterima ke Travis CI;
- travis_base_url - tentukan alamat API Travis CI;
- travis_repository_id - tentukan id repositori dengan autotest, di dalam Travis CI;
- telegram_chat_id - tentukan id obrolan dari telegram tempat pesan dari bot akan dikirim;
- telegram_bot_url - tentukan url ke bot.
Contoh Conf.ini [travis] travis_token = token HkjhkjgGKJhjgFGfdgd travis_base_url = https://api.travis-ci.org travis_repository_id = 10898384 [telegram] telegram_chat_id = 24234234 telegram_bot_url = https://api.telegram.org/bot87543366:AAHtj9zs-Kv4zGWyu1eTXegikUYMGVjD8g/
Prinsip-prinsip botPenting bahwa setiap permintaan harus memberikan status respons 200. Jika tidak, telegram mulai mengirim permintaan secara siklis hingga menerima respons yang valid.
Bot memiliki serangkaian perintah:
Pembatas dapat berupa karakter khusus apa pun kecuali garis bawah.
- add_m - tambahkan kit pengujian (tanda python).
Templat: * perintah * {deskripsi kit} {pembatas} {tanda nama}.
Contoh: add_m Menguji burung / burung. - add_b - tambahkan cabang untuk pengujian.
Templat: * perintah * {deskripsi cabang} {pembatas} {nama cabang dari git}.
Contoh: add_b Master. - pilih - memungkinkan Anda memilih cabang untuk pengujian secara default.
Templat: * perintah *.
Contoh: Setelah memasukkan perintah pilih, tombol muncul untuk memilih cabang yang ditambahkan ke database dengan perintah add_b. - run - Perintah untuk memulai perakitan.
Templat: * perintah *.
Contoh: Setelah memasukkan perintah jalankan, tombol untuk memilih set autotests yang ditambahkan ke database dengan perintah add_m muncul. Saat memulai, cabang yang ditentukan oleh perintah pilih dipilih secara otomatis. - del_m - menghapus satu set tes.
Templat: * perintah * {tanda nama}.
Contoh: burung del_m. - del_b - menghapus cabang yang dimasukkan dalam database.
Templat: * command * {branch from git}.
Contoh: master del_b.
Bagaimana cara kerja bot?1. Pengguna menambahkan test suite (add_m):
Perintah membagi data pengguna menjadi 2 bagian - deskripsi dan nama cabang di git. Nama ini ditulis di kolom mark_name di dalam database, dan deskripsi di kolom mark_description.
2. Pengguna menambahkan cabang (add_b):
Perintah membagi data pengguna menjadi 2 bagian - deskripsi dan nama cabang di git. Nama ini ditulis di kolom branch_name di dalam database, dan deskripsi di kolom branch_description.
3. Pengguna memilih cabang default (pilih):
Pengguna menerima tombol dalam obrolan, dibentuk sesuai dengan data dari tabel branch_description dan branch_name. Pengguna memilih tombol dengan cabang yang diinginkan. Itu ditulis ke tabel favorite_branch.
4. Pengguna memulai inisialisasi build (run):
Pengguna menerima tombol dalam obrolan, dibentuk sesuai dengan data dari tabel
mark_description dan mark_name. Pengguna memilih tombol dengan kit untuk menjalankan autotest.
Berdasarkan pada data yang dipilih oleh pengguna, bot menghasilkan permintaan dalam metode pemicu di kelas TravisCI dan mengirimkannya ke Travis untuk dieksekusi. Di dalam sistem Travis, memicu opsi membangun diaktifkan. Opsi ini menimpa file travis.yml, mengubah bagian skrip menjadi data yang dipilih pengguna.
Penempatan di HEROKU
Agar bot berfungsi, ia harus digunakan untuk hosting. Saya sarankan menggunakan Heroku, karena platform ini memiliki tarif gratis, yang memberikan kekuatan yang diperlukan agar bot bekerja.
Bagaimana cara menyebarkan bot?Agar tidak menggambarkan keseluruhan proses, saya akan meninggalkan tautan ke
dokumentasi resmi sebagai permulaan:
Jika Anda ingin bekerja dengan Heroku melalui GUI, isi kode pada Github. Anda perlu mendaftar melalui antarmuka web Heroku. Setelah mendaftar, klik Baru -> Buat aplikasi baru -> Masukkan nama aplikasi dan pilih suatu wilayah. Buka tab Penyebaran dan pilih integrasi dengan Github dalam metode Penyebaran.
Sebelum kita muncul blok untuk mencari repositori. Masukkan nama repositori dan klik tombol Cari. Di hasil pencarian, di seberang nama repositori, klik tombol Connect. Di blok penyebaran Manual, pilih cabang dan klik "Menyebarkan".
Saat terakhir - Anda harus mengaktifkan webhook menggunakan permintaan GET:
https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot
Bot bisa digunakan. Kami memeriksa bahwa semuanya bekerja untuk kami:
