简单 UI 自动化测试框架 seldom

https://github.com/SeldomQA/seldom

seldom 的定位

如果把 unittest/pytest + HTMLTestRunner/allure + selenium + PO + ... 看成是 DIY 电脑的话,那 seldom 就品牌机, 品牌机用起来就是比较省心,适合小白用户,高手轻喷或绕道。

seldom 本质上 基于 unittest 和 selenium 封装。

pytest更强大,为什么选 unittest?

项目下有详细的文档,我就介绍自认为的几个特色吧!

提供脚手架

通过命令创建项目,降低小白门槛嘛!

> seldom -project mypro

目录结构如下:

mypro/
├── test_dir/
│   ├── data.json
│   ├── test_sample.py
├── reports/
└── run.py

编写脚本更简单

执行下面的代码就可以生成报告测试报告了。

import seldom


class YouTest(seldom.TestCase):

    def test_case(self):
        """a simple test case """
        self.open("https://www.baidu.com")
        self.type(id_="kw", text="seldom")
        self.click(css="#su")
        self.assertTitle("seldom_百度搜索")


if __name__ == '__main__':
    seldom.main()

运行用例

> python3 run.py
2020-05-16 11:34:36,014 INFO
            _      _
           | |    | |
 ___   ___ | |  __| |  ___   _ __ ___
/ __| / _ \| | / _` | / _ \ | '_ ` _ \
\__ \|  __/| || (_| || (_) || | | | | |
|___/ \___||_| \__,_| \___/ |_| |_| |_|
-----------------------------------------
                             @itest.info

2020-05-16 11:34:38,798 INFO ✅ Find element: id=kw
2020-05-16 11:34:38,813 INFO 🖋 input 'seldom'.
2020-05-16 11:34:38,991 INFO ✅ Find element: css selector=#su
2020-05-16 11:34:39,004 INFO 🖱 click.
2020-05-16 11:34:40,091 INFO 👀 assertIn title: seldom_百度搜索.
2020-05-16 11:34:40,092 INFO generated html file: file:////Users/tech/mypro/reports/2020_05_16_11_34_36_result.html
.1%

测试报告

数据驱动

支持代码中的数据驱动,也支持 excel, csv, xml, json 外部文件的数据驱动。

import seldom
from seldom import data


class BaiduTest(seldom.TestCase):

    @data([
        (1, 'seldom'),
        (2, 'selenium'),
        (3, 'unittest'),
    ])
    def test_baidu(self, name, keyword):
        """
         used parameterized test
        :param name: case name
        :param keyword: search keyword
        """
        self.open("https://www.baidu.com")
        self.type(id_="kw", text=keyword)
        self.click(css="#su")
        self.assertTitle(keyword+"_百度搜索")

json 文件

{
 "login":  [
    ["admin", "admin123"],
    ["guest", "guest123"]
 ]
}

调用 json 文件

import seldom
from seldom import file_data


class YouTest(seldom.TestCase):

    @user3("./data.json", key="login")
    def test_login(self, username, password):
        """a simple test case """
        print(username)
        print(password)
        # ...

你不喜欢 seldom 的,也可以用第三方的 ddt 。

Page Objects 设计模式

seldom 和 poium 配合使用。

import seldom
from poium import Page, Element


class BaiduPage(Page):
    """baidu page"""
    search_input = Element(id_="kw")
    search_button = Element(id_="su")


class BaiduTest(seldom.TestCase):
    """Baidu serach test case"""

    def test_case(self):
        """
        A simple test
        """
        page = BaiduPage(self.driver)
        page.get("https://www.baidu.com")
        page.search_input = "seldom"
        page.search_button.click()
        self.assertTitle("seldom_百度搜索")


if __name__ == '__main__':
    seldom.main()

生成随机数据

seldom 提供了一些方法可以生成常用的随机数据。用户名、邮箱、日期、手机号...都可以随机生成。

import seldom
from seldom import testdata


class YouTest(seldom.TestCase):

    def test_case(self):
        """a simple test case """
        word = testdata.get_word()
        self.open("https://www.baidu.com")
        self.type(id_="kw", text=word)
        self.click(css="#su")
        self.assertTitle(word + "_百度搜索")


if __name__ == '__main__':
    seldom.main()

用例依赖

虽然不建议将用例设计的有依赖,但有时不可避免。seldom 中也比较方便的实现了这一功能。

import seldom
from seldom import depend


class TestDepend(seldom.TestCase):

    def test_001(self):
        self.get("https://www.runoob.com/try/try2.php?filename=bootstrap3-form-checkboxradio")
        self.switch_to_frame(id_="iframeResult")
        self.click(css='[type=checkbox]--error')  # 元素定位错误

    @depend("test_001")
    def test_002(self):
        self.click(xpath='//input[@type="checkbox"]', index=1)

    @depend("test_002")
    def test_003(self):
        self.click(id_='optionsRadios1')

if __name__ == '__main__':
    seldom.main()

seldom 是灵活的

例如,你只是觉得 seldom 的生成随机数好用,你完全可以单独拿出来用。

import pytest
from selenium import webdriver
from seldom import testdata


def test_case():
    dr = webdriver.Chrome()
    dr.get("https://www.baidu.com")
    dr.find_element_by_id("kw").send_keys(testdata.get_word())

最后

为什么发到 testerhome

  1. 我能力有限,有些功能做不出来。

  2. 目前针对 seldom 没有太多想要增加的功能了。

  3. 主要是想吸引一些高手参与到项目中,如果你认同项目的定位,有更好的一下想法,都可以把他在 seldom 中实现(因为我不会!)。

最后,最后, seldom 的定位是在尽量简洁的基础上把写代码权利 交给 测试人员自己。如果想以 excel 表格 或 json 之类的文件写用例。那么 seldom 不适合你!


↙↙↙阅读原文可查看相关链接,并与作者交流