测试平台训练营 1-设计与实现

霍格沃兹测试开发

ceshiren.com

训练营目标

  • 测试平台的价值体系
  • 测试平台的学习路线
  • 测试平台实战练习

问题

  1. 为什么要做测试平台?为什么我们要学习平台开发的技术?怎么样去做测试平台才能达到价值最大化(个人、公司)
  2. 平台开发技术要学到什么程度?一定要非常深入吗?
  3. 平台开发需要掌握什么技术栈,如何学习可以提升投入产出比?

测试平台-功能设计

功能点 描述 案例
项目管理 对于项目的分类,通常以业务线为维度 商城、飞书、企业微信
测试类型 手工测试、自动化测试 pytest、JUnit、HttpRunner、Postman
测试用例 测试用例的信息 标题、步骤、预期结果、实际结果
测试套件 用例的集合 通常是用例从不同维度组合,冒烟测试用例集,某业务线用例集
测试装置 用例执行前后的准备工作,处理工作 用例依赖环境的安装,比如 python requirements
测试 Runner 测试用例执行器调度器 执行环境的管理:性能测试环境、兼容性环境
测试报告 测试结果的体现 allure 报告、手工报告

测试平台-学院平台案例

  • 项目管模块
    • 项目搜索
    • 项目新建
    • 项目编辑
    • 项目配置
    • 团队管理
    • 角色管理

测试平台-学院平台案例

  • 支持自动化测试框架管理
    • Web 自动化测试
    • App 自动化测试
    • 接口自动化测试
    • 兼容性测试
  • 支持多样化测试能力管理
    • 性能测试
    • 安全测试
    • 大数据测试

测试平台-学院平台案例

  • 测试报告管理
    • 支持测试结果管理
    • 支持多种测试能力的自定义报告管理
    • 支持数据分析
    • 支持用例趋势图、Bug 趋势图等图表管理

测试平台-学院平台案例

  • 支持手工测试用例执行实时监控
  • 支持自动化测试用例执行实时监控
  • 支持多种测试能力的执行实时监控

其他案例

测试平台的个人价值

  • 个人价值:
    • 测试方案能力。(重要)
    • 测试工具产品设计能力。(重要)
    • 前后端的技术能力。

测试平台的产品价值

  • 公司收益(提效):

    1. 提效
    2. 提升质量
    3. 降低成本
  • 市场收益:

    1. 知名度与影响力
    2. 成熟的商业模式,也有巨大的市场空间。带来直接的创收。
    3. 代表产品: wetest、禅道、process on、figma

测试平台的“Timing”

  1. 需求: 公司需要测试能力服务化、平台化,比如整合内部的多套平台。
  2. 体系: 公司有成熟的测试体系:自动化测试、持续集成
  3. 人力: 有成熟的技术团队,包括前端、后端、测试开发三个角色

测试平台的学习路线

技术-前端

  • 界面展示
  • 良好的用户体验
  • 数据展示
  • 相关技术: VUE、React 等

技术-后端

  • 把控业务逻辑
  • 数据库交互
  • 相关技术:Flask、Django、SpringBoot

数据库

  • 数据的持久化存储
  • 数据操作
  • 相关技术: MySQL、Oracle

测试用例管理

  • 测试标题
  • 测试套件
  • 测试步骤
  • 测试装置
  • 测试断言
  • 测试结果
  • 测试执行器

参考知识 xUnit:https://en.wikipedia.org/wiki/XUnit

测试用例调度

  • 定时任务
  • 分布式
  • 触发机制
  • 拓展性配置
  • 相关技术: Jenkins

实战前提

前后端的录播全部看完,并且完成前后端的实战练习

https://course.hogwarts.ceshiren.com/courses/进阶班/课程大纲Python/#-python

实战路线

现有后端代码的问题

如果一家饭店,从服务员->厨师->收银都是一个人,会成什么样子?

  • 耦合性强
  • 可维护性差
  • 可测性差

代码分层的目的

各司其职(高内聚),轻松协作(低耦合),就是分层思想的目标。

  • 方便后续代码进行维护扩展。
  • 分层的效果需要让整个团队都接受
  • 各个层职责边界清晰

测试平台后端架构

  • 路由层(Controller)
  • 服务层(Service)
  • 数据层(Dao)
  • DO 层(实体类)

实体类

  • entity(DO实体类)的作用一般是和数据表做映射
  • 此对象与数据库表结构一一对应
# 创建用例表
class TestCase(db.Model):
    # 表名
    __tablename__ = "testcase"
    # 用例ID 用例的唯 一标识
    id = db.Column(Integer, primary_key=True)
    # 用例的标题 或者文件名,限定 80个字符 ,不为空,并且唯一
    uid = db.Column(String(80), nullable=False, unique=True)
    # 备注
    remark = db.Column(String(120))

优化思路

实战1

  • 根据要求,完成后端架构优化

业务架构

测试平台表结构

教学版

一对多(测试计划与构建记录)

class BuildDo(db.Model):
    # 表名
    __tablename__ = "build"
    # 用例ID 用例的唯 一标识
    id = db.Column(Integer, primary_key=True)
    # 用例的标题 或者文件名,限定 80个字符 ,不为空,并且唯一
    plan_id = db.Column(Integer)
    report = db.Column(String(80))
    create_time = Column(DateTime, nullable=True, default=datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

    def as_dict(self):
        return {"plan_id": self.plan_id, "report": self.report, "create_time": str(self.create_time)}


class PlanDo(db.Model):
    # 表名
    __tablename__ = "plan"
    # 用例ID 用例的唯 一标识
    id = db.Column(Integer, primary_key=True)
    # 用例的标题 或者文件名,限定 80个字符 ,不为空,并且唯一
    name = db.Column(String(80), nullable=False, unique=True)
    testcases = relationship("TestCaseDo",
                             secondary=testcase_plan_rel,
                             backref="plans")

    def as_dict(self):
        return {"id": self.id, "name": self.name,
                "testcase_info": " ".join([testcase.case_title for testcase in self.testcases]) }

多对多(测试计划与测试用例)

# 中间表
testcase_plan_rel = db.Table(
    'testcase_plan_rel',
    Column('testcase_id', Integer,
           ForeignKey('testcase.id'),
           primary_key=True),
    Column('plan_id', Integer,
           ForeignKey('plan.id'),
           primary_key=True)
)
# 测试计划表

class PlanDo(db.Model):
    # 表名
    __tablename__ = "plan"
    # 用例ID 用例的唯 一标识
    id = db.Column(Integer, primary_key=True)
    # 用例的标题 或者文件名,限定 80个字符 ,不为空,并且唯一
    name = db.Column(String(80), nullable=False, unique=True)
    testcases = relationship("TestcaseDo",
                             secondary=testcase_plan_rel,
                             backref="plans")

    def as_dict(self):
        return {"id": self.id, "name": self.name,
                "testcase_info": " ".join([testcase.uid for testcase in self.testcases]) }
# 用例表
class TestCaseDo(db.Model):
    # 表名
    __tablename__ = "testcase"
    # 用例ID 用例的唯 一标识
    id = db.Column(Integer, primary_key=True)
    # 用例的标题 或者文件名,限定 80个字符 ,不为空,并且唯一
    case_title = db.Column(String(80), nullable=False, unique=True)
    # 备注
    remark = db.Column(String(120))
    # 用例的创建时间
    # created_at = ""
    def as_dict(self):
        return {"id": self.id, "case_title": self.uid, "remark": self.remark}

实战2

  1. 完成测试计划、测试用例、构建记录的表创建
  2. 实现Service逻辑,先忽略调度部分

实战3

实现Service逻辑,先忽略调度具体的实现部分

  1. 测试用例:增删查改
  2. 测试计划:增加、查询
  3. 测试计划:增加