使用Telegram进行自动化测试管理

作为质量检查工程师,我开发了一个自测系统。 面临许多问题:

  • 对于每种类型的测试,我必须在CI中创建自己的作业,然后手动运行它们。
  • 开发人员拒绝运行自检案例。
  • 无法在设备上的任何位置运行自动测试。
  • 质量检查手动测试工程师无法自行运行自动测试。

因此,我决定为该机器人创建一个小的原型,以运行自动化测试,该机器人将涵盖上述大多数问题。

想法描述:

用户根据配置中指定的规则,向聊天发送必要的命令,在CI系统中启动构建。 CI使用pytest标记运行自动测试。 运行之后,测试存储库中的脚本接收有关构建状态的信息,收集日志并将其通过电报聊天发送回用户。

工具:

工具
  • 编程语言-Python
  • 测试框架-Pytest
  • HTTP客户端-请求
  • 数据库-SQLite3
  • ORM-Peewee
  • CI系统-Travis CI



目录内容

  1. 准备工作
  2. 机器人注册
  3. 准备测试库
  4. 测试和记录
  5. 报告生成
  6. 配置Travis CI
  7. 机器人程序
  8. 机器人的原理
  9. 在Heroku上部署


机器人注册


首先,我们需要注册该机器人的电报并获取其唯一ID(即令牌)。 为此,将消息/ start写入@BotFather机器人。
我们的主要团队是/ newbot,通过输入,我们将被要求提供机器人的名称。
但是有一条规则-名称必须以bot结尾。 BotFather使用机器人的名称并返回您的令牌。 通过开始聊天来激活机器人。 接下来,您需要将API请求发送到getUpdates方法。

https://api.telegram.org/bot{_}/getUpdates 

记住收到的hat_id。


准备测试库


接下来,您需要使用测试来组织存储库,或者使用预先准备的文章。


测试和记录

创建测试功能,并用pytest标记进行标记-完整,烟雾和鸟状。

通过创建pytest.ini文件并在测试函数中的日志记录库中添加对info方法的调用,将日志记录添加到我们的测试中非常重要。
pytest.ini文件包含实时日志的模板和一个日志文件。

测试例
 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' 




报告生成

我们创建一个脚本,该脚本在组装完成后从CI系统收集信息,并将其与日志一起发送到电报聊天。
在脚本内部,您需要用先前收到的值替换TELEGRAM_BOT和CHAT_ID值。

脚本代码
 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() 


该脚本使用系统变量并从Travis CI接收值。

如果TRAVIS_TEST_RESULT的值不等于零,则将该值设置为“ Successfully”,首先处理send_message函数,该函数将程序集信息发送到聊天(存储库名称,所选分支,所使用的提交名称,链接到Web日志),然后发送send_file函数日志文件。

在测试库中,添加配置文件-travis.yml。 在内部,我们描述了装配将通过其工作的管道。

travis.yml
 language: python python: - "3.7" install: - pip install -r requirements.txt script: pytest -m smoke after_script: - python tg_command.py 


接下来,我们需要在GitHub上部署存储库,以将其添加到Travis CI。


设定TRAVIS_CI


我们去了现场
使用您的GitHub帐户登录。 切换到仪表板选项卡。 先前已打开DevTools(Network),然后在测试存储库对面的站点的“存储库”子选项卡中,移动滑块-激活其装配。 在“网络”选项卡(DevTools)中,一个活动请求到达,在预览中有关于存储库ID的信息,必须记住该编号(复制/写入)。 在设置选项卡中切换到该站点。 我们复制或记住令牌-我们需要它。


机器人程序


在本文中,我们不会过多地分析代码,您可以在存储库中看到它。 现在,对我们而言,了解该主题的基础很重要,因此让我们继续设置我们的机器人:

存储库内部是文件:

  1. main.py-机器人脚本;
  2. models.py-带有ORM模型的文件;
  3. conf.ini-具有配置变量的文件;
  4. runtime.txt-修正了Travis CI的Python版本值;
  5. procfile-gunicorn的设置;
  6. wsgi.py-使用gunicorn的应用程序启动文件。

为了使您的机器人正常工作,您需要替换conf.ini中的数据,即:

  • travis_token-向Travis CI指示收到的令牌;
  • travis_base_url-指定Travis CI API的地址;
  • travis_repository_id-在Travis CI内部通过自动测试指定存储库的ID;
  • telegram_chat_id-指定将来自机器人的消息发送到的电报的聊天ID;
  • telegram_bot_url-指定漫游器的网址。

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/ 



机器人的原理

每个请求必须给出200的响应状态,这一点很重要。否则,电报将开始周期性地发送请求,直到收到有效的响应为止。

该机器人具有一组命令:

分隔符可以是下划线以外的任何特殊字符。

  • add_m-添加测试工具包(python标记)。
    模板:*命令* {工具说明} {分隔符} {名称标记}。
    示例:add_m测试鸟/鸟。
  • add_b-添加一个分支进行测试。
    模板:*命令* {分支的描述} {分隔符} {git分支的名称}。
    示例:add_b主服务器。
  • select-默认情况下,允许您选择一个分支进行测试。
    模板:*命令*。
    示例:输入选择命令后,将出现按钮,用于选择使用add_b命令添加到数据库的分支。
  • run-启动装配的命令。
    模板:*命令*。
    示例:输入运行命令后,将显示用于选择通过add_m命令添加到数据库的自动测试集的按钮。 启动时,将自动选择由select命令指定的分支。
  • del_m-删除一组测试。
    模板:*命令* {名称标记}。
    示例:del_m bird。
  • del_b-删除在数据库中输入的分支。
    模板:*命令* {从git分支}。
    示例:del_b master。

该机器人如何工作?

1.用户添加一个测试套件(add_m):
该命令将用户数据分为两部分-git中分支的描述和名称。 名称写在数据库内的mark_name列中,描述写在mark_description列中。

2.用户添加分支(add_b):
该命令将用户数据分为两部分-git中分支的描述和名称。 名称写在数据库内的branch_name列中,描述写在branch_description列中。

3.用户选择默认分支(选择):
用户在聊天中接收按钮,这些按钮是根据来自表branch_description和branch_name的数据形成的。 用户选择具有所需分支的按钮。 它被写入收藏夹表。

4.用户开始构建初始化(运行):
用户会根据表格中的数据在聊天中接收按钮
mark_description和mark_name。 用户选择带有工具包的按钮来运行自动测试。

机器人根据用户选择的数据,在TravisCI类的触发方法中生成一个请求,并将其发送到Travis进行执行。 在Travis系统内部,触发了build选项。 此选项将覆盖travis.yml文件,将脚本部分更改为用户选择的数据。


在HEROKU上部署


为了使机器人正常工作,必须将其部署到主机。 我建议使用Heroku,因为该平台有免费的资费,可以为机器人工作提供必要的动力。

如何部署机器人?

为了不描述整个过程,我将在开始时留下指向官方文档的链接:

如果要通过GUI使用Heroku,请在Github上填写代码。 您需要通过Heroku Web界面进行注册。 注册后,单击新建->创建新应用->输入应用名称并选择一个地区。 转到Deploy选项卡,然后在Deployment方法中选择与Github的集成。

在我们面前出现了一个用于搜索存储库的块。 输入存储库的名称,然后单击“搜索”按钮。 在搜索结果中,与存储库名称相对应,单击“连接”按钮。 在“手动部署”块中,选择分支,然后单击“部署”。

最后一刻-您需要使用GET请求激活Webhooks:
 https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot 


该机器人可以使用。 我们检查是否一切对我们都有效:

图片

Source: https://habr.com/ru/post/zh-CN471364/


All Articles