pveltrop/pyrunner

Python/Selenium 测试运行器

dev-master 2021-07-08 19:42 UTC

This package is auto-updated.

Last update: 2021-07-08 19:42:05 UTC


README

image

关于 PyRunner

Pyrunner 是一个 Python 包,它可以运行 Laravel 应用程序的浏览器测试。Pyrunner 当前具有以下功能:

  • 以开发模式交互式开发浏览器测试
  • 记录每个步骤并截图
  • 自动重试失败测试,次数不限
  • 易于在 CICD 中使用,比 Laravel Dusk 更不容易崩溃

使用方法

安装 Python: https://pythonlang.cn/downloads/release/python-381/

安装 Pip: https://pip.pypa.org.cn/en/stable/installing/

转到您项目的根目录。

安装此包

composer require pveltrop/pyrunner:dev-master#(commit)

然后在 Laravel 项目中安装 PyRunner

php artisan pyrunner:install

准备您的(测试)数据库

php artisan migrate:fresh --seed (--database=mysql_testing)

在新的终端中启动 PyRunner

php artisan pyrunner:start (--dev) (--debug) (--shell) (--screenshots)

在您的活动终端中启动 PyRunner

python vendor/pveltrop/pyrunner/test_app.py (--dev) (--debug) (--shell) (--screenshots)

参数

开发 (--dev)

php artisan pyrunner:start --dev

启动应用程序并插入断点。这意味着您将获得一个交互式终端,因此您可以在其中测试浏览器命令或单独运行测试。

请注意

开发模式将在启动时插入断点,因此您可以在 _tests.py 文件中运行任何您想要的内容。

ipdb>

因此,如果您想在 _tests.py 中运行 fake 函数,请运行 fake().name()(例如)

ipdb> fake.email()
'siennaschiffer@van.com'

如果您想运行所有测试,并在任何地方失败时插入断点(您的测试代码将每次重新加载)

ipdb> RunTests()

如果您想重新运行单个测试,首先直接输入

ipdb> reload(tests)

这将重新加载您的 _tests.py 文件。然后

ipdb> tests.nameoftest()

调试 (--debug)

php artisan pyrunner:start --debug

此选项将在测试命令执行期间启用更具体的输出。这可能有助于确定 PyRunner 哪里存在问题。

截图 (--screenshots)

php artisan pyrunner:start --screenshots

此选项将启用截图。每当您定义一个新的步骤(pr.step())时,都会生成截图。

ENV

php artisan pyrunner:env

此选项将生成 .env.example 和 .env.testing 文件。更改您想要或不需要在版本控制中更改的值。

为 Laravel 配置

请确保您的 APP_URL 设置正确,与您本地使用的地址相同。

  • 如果您在执行 php artisan pyrunner:install 时跳过了此步骤,请创建一个 .env.testing 文件,用于本地和 GitLab 测试。
php artisan pyrunner:env

如果此环境在本地上不工作,在 GitLab 上也不会工作。

  • 重要:设置 TELESCOPE_ENABLED=false,否则当前迁移将无法工作

可选:如果您想通过 Slack 或 Pushbullet 收到测试结果

  • 在 GitLab 上,转到设置 -> CI/CD -> 变量
  • 定义一个 SLACK 变量,这是您想要使用的 webhook 的 URL
  • 定义一个包含您Pushbullet账户API密钥的PUSHBULLET变量
  • 对于pushbullet,在yml文件中传递一个GitLab变量,参数为:--pbchannel=channelName

如果需要自行托管GitLab runner,则是可选的

  • 在电脑上安装GitLab runner,并将其链接到CI/CD中的项目仓库
  • 在此电脑上安装docker,并拉取您之前构建的镜像
docker pull registry.gitlab.com/(group)/(repository)

编写测试

  • 在项目根目录的_tests.py中定义测试函数,具有以下结构

# -----------------------------------------------------------
# Tests
# -----------------------------------------------------------
        
def users_can_login():
    pr.start('Users Can Login') # Prints start of test
    pr.step('Logout first') # Prints current step being executed
    pr.browser.get('https:///_testing/pylogout') # Redirecting browser
    pr.step('Enter email') 
    pr.type_xpath('//*[@id="email"]', pyUserEmail) # Typing in a field
    pr.step('Enter password') 
    pr.type_xpath('//*[@id="password"]', pyUserPassword)
    pr.step('Login') 
    pr.click('//*[@id="kt_login_signin_submit"]','#kt_login_signin_submit','kt_login_signin_submit') # Click function has 3 parameters. The order is: Xpath selector, CSS selector, ID selector. Send atleast one.
    pr.end('Users Can Login') # Prints end of test
    
# -----------------------------------------------------------
# End of tests
# -----------------------------------------------------------

  • 使用以下结构定义重构函数

# -----------------------------------------------------------
# Refactoring/scanning
# -----------------------------------------------------------

def scan_for_dd():
    pr.start('Check if all dd() is removed from code')
    pr.step('Scan files with RegEx')
    pr.scan_regex(r"dd\([\',\"].*[\',\"]\)")
    pr.end('Check if all dd() is removed from code')
    
# -----------------------------------------------------------
# End of refactoring
# -----------------------------------------------------------

测试命令

pr.click(xpath,css,id)

参数是HTML元素的选择器。在Chrome/Firefox中右键点击(所有三个都是可选的,但使用越多,点击成功的可能性越大。)

pr.switch_tab(index)

切换浏览器到提供的索引

选择

pr.select_value_name(name, value)

通过值选择HTML元素中的选项

pr.select_index_name(name, index)

通过索引选择HTML元素中的选项

pr.select_value_id(id, value)

通过值选择HTML元素中的选项

pr.select_index_id(id, index)

通过值选择HTML元素中的选项

pr.find_text(text)

在当前页面上查找文本

pr.find_id(id)

尝试通过ID找到可见元素

pr.find_class(class)

尝试通过Class找到可见元素

pr.find_css(css)

尝试通过CSS选择器找到可见元素

pr.find_name(name)

尝试通过Name找到可见元素

pr.find_xpath(xpath)

尝试通过Xpath找到可见元素

输入

pr.type_xpath(xpath)

尝试在通过xpath选择的元素中输入

pr.type_name(name)

尝试在通过name选择的元素中输入

pr.type_id(id)

尝试在通过id选择的元素中输入

pr.type_css(css)

尝试在通过css选择的元素中输入

pr.change_text_xpath(xpath)

尝试清除并通过xpath选择的元素输入文本

pr.change_text_name(name)

尝试清除并通过name选择的元素输入文本

pr.change_text_id(id)

尝试清除并通过id选择的元素输入文本

pr.change_text_css(css)

尝试清除并通过css选择的元素输入文本

Docker镜像

准备Docker镜像

  • 为您的项目构建一个Docker镜像
- Navigate to the Docker folder in this repo
- Copy and paste the following files from your project to this folder, to speed up CI/CD:
composer.json
composer.lock
package.json
package-lock.json
- docker login registry.gitlab.com
- docker build -t registry.gitlab.com/(group)/(repository) .
- docker push registry.gitlab.com/(group)/(repository)
  • 更新.gitlab-ci.yml中使用的Docker镜像