Rains2 1.3.6
Rains2 旨在于创建一个易用、稳定且高效的多进程自动化测试框架。

# 框架简介

Rains2 旨在于创建一个易用、稳定且高效的多进程全栈自动化测试框架。

框架的核心在于封装的多个自动化套件，高度统一的工作流，以及一个内置的多进程启动器。

除此之外，Rains2 实现了一个轻量化的 task 类用以支持多进程运行脚本与生成测试数据。

开箱即用！

对于 Rains2 的使用者而言，仅需要一些 Python 的基础知识，便可上手开始编写自动化脚本。

通过近乎一致的方式去编写不同项目的自动化脚本。

Rains2 抽象了这些差异，同时隐藏了它们之间的细节与复杂性，这意味着更低的学习成本。

使用者可以将更多精力集中于用例本身的设计上。

**[注意] 目前仅集成了 WEB 自动化套件，计划未来将集成小程序，APP与接口相关的自动化套件**

***

# 快速上手示例 (WEB)

### 安装 Rains2 库

    可以使用 pip 安装 Rains2 库:

    pip install Rains2

    或者，您也可以下载 [PyPI source archive](https://pypi.org/project/Rains2/#modal-close) (Rains2-x.x.x.tar.gz) 并使用 setup.py 进行安装：

    python setup.py install
    

### 环境搭建

    Rains2.kit.web 基于 Selenium 实现，所以除了必要的 Python 环境之外，还需要安装以下环境：

    1. 浏览器

    2. 浏览器驱动

    需要注意的是浏览器与浏览器驱动的版本必须是一致，并且需要将驱动路径添加到系统环境变量中。

    [注意] 目前仅支持 Chrome 浏览器


### 创建测试项目

    我们可以在任意位置创建项目目录 -> demo


### 构建页面模型

    应用程序(app/web)由若干个页面组成，项目中我们需要以 "页面" 为单位，为其建立页面模型。

    页面模型将包含该页面业务所需的所有可视化、可操作的元素。

    该步骤并非是必要的，但创建页面模型有助于我们复用与管理我们的组件。

    在项目目录中创建一个目录以管理页面模型 -> demo/models

    接下来以百度首页为例，创建第一个页面模型：

```python
# PATH:: demo/models/model_bd_home.py


# 导入模型基类
from Rains2.kit.web.web_plant import WebModel


# 创建一个继承了模型基类 WebModel 的模型类
class ModelBdHome(WebModel):
    """
    [ 页面模型::百度首页 ]
    
    """

    # 每一个函数都被视为一个组件，一个模型中存在多个组件
    @property
    def input_search(self):
        """
        [ 组件::百度首页::搜索输入框 ]

        """
        
        # 构建组件需要使用构建工厂类 Plant，它由模型基类 WebModel 继承而来
        # 具体细节可以参考 wiki 或源码注释
        return self.plant.element(
            page='百度首页',
            name='搜索输入框',
            by_key='xpath',
            by_value='//input[@id="kw"]'
        )

    @property
    def btn_search_confirm(self):
        """
        [ 组件::百度首页::搜索按钮 ]

        """
        
        return self.plant.element(
            page='百度首页',
            name='搜索按钮',
            by_key='xpath',
            by_value='//input[@id="su"]'
        )

```


### 编写任务类

    现在我们拥有了一个对应百度首页的页面模型了。

    该模型拥有两个组件，他们分别是搜索输入框与搜索按钮。

    现在，我们可以开始编写自动化脚本代码了。

    在项目目录中创建一个目录以管理任务 -> demo/tasks

```python
# PATH:: demo/tasks/task_01_bd_search.py


# 导入任务基类
from Rains2.kit.web.web_task import WebTask

# 导入需要用到的页面模型
from demo.models.model_bd_home import ModelBdHome


# 创建一个继承了任务基类 WebTask 的任务类
class Task01BdSearch(WebTask):
    """
    [ 任务::百度搜索 ]

    """
    
    model_bd_home: ModelBdHome

    # 任务类中定义了两种函数: 全局函数 / 用例函数
    # 全局函数会在整个任务执行过程种多次执行：
    # set_class_starting    :: 类起点函数，全局执行一次，通常用于初始化工作
    # set_class_ending      :: 类终点函数，全局执行一次，通常用于销毁工作
    # set_function_starting :: 用例起点函数，每个用例函数开始前都会执行一次
    # set_function_ending   :: 用例终点函数，每个用例函数结束后都会执行一次
    def set_class_starting(self):
        """
        [ 类起点函数 ]
        
        """
        
        # 实例化页面模型需要传递构建工厂类 Plant，它由任务基类 WebTask 继承而来
        self.model_bd_home = ModelBdHome(self.plant)

    def set_class_ending(self):
        """
        [ 类终点函数 ]
        
        """
        
        # 引擎对象 Engine 由任务基类 WebTask 继承而来
        # 当前任务的所有用例执行完毕后，销毁引擎
        self.engine.end()

    def set_function_starting(self):
        """
        [ 用例起点函数 ]
        
        """
        
        # Plant.view 提供了视图相关的功能封装
        # 具体可以参考 wiki 或源码
        # 每次用例开始前，访问百度首页
        self.plant.view.to_url('https://www.baidu.com/')

    def set_function_ending(self):
        """
        [ 用例终点函数 ]
        
        """
        
        # 用例函数执行完毕后，重置页面
        self.engine.reset()

    # 这是用例函数
    # 如果一个函数以 case 开头(可以是 case|Case|CASE)，则它就是用例函数
    def case_01(self):
        """
        [ 测试用例:: 搜索一些内容 ]

        """
        
        # 在用例中，我们需要通过页面模型去操作其组件完成一些行为
        # 调用方式为 -> 页面模型.组件.方法函数()
        
        # 页面模型.input 封装了输入框的相关函数
        # 在搜索输入框中输入文本
        self.model_bd_home.input_search.input.send('自动化测试前景')

        # 页面模型.mouse 封装了鼠标操作的相关函数
        # 点击搜索按钮
        self.model_bd_home.btn_search_confirm.mouse.tap()

        # 用例函数如果返回 True 或 不返回任何内容 都将表示用例通过
        # 返回 False 则表示用例失败
        # 这里，我们不添加任何断言条件
        return True

```

### 执行任务

    现在，我们已经创建了一个任务，只剩最后一步了：执行任务。

    在实际的需求中，根据不同的项目或者用例覆盖目的，往往需要灵活配置的自定义启动入口：

    在项目目录中创建一个运行入口用以运行指定的任务类 -> demo/main.py

```python
# PATH:: demo/main.py


# 导入WEB核心
from Rains2.kit.web.web_core import WebCore

# 导入多进程执行器 RunPool
from Rains2.core.run_pool import RunPool

# 导入需要执行的任务类
from demo.tasks.task_01_bd_search import Task01BdSearch


# Core是任务类的消费者，亦可用于单进程执行任务
WebCore().running(Task01BdSearch)

# 多进程执行任务
RunPool(

    # 定义核心队列
    cores=[WebCore(), WebCore()],

    # 定义任务队列
    tasks=[Task01BdSearch, Task01BdSearch, Task01BdSearch]

).running()

```