unittest测试框架(二)

# !/usr/bin/env python
# -*- coding:utf-8 -*-
'''
Java的继承与Python的继承有什么区别
    Java:对象在调用父类中方法时,该方法调用的方法会优先使用子类的方法,调用的成员变量会优先调用父类的变量。
    Java:因为涉及到变量属性的问题,必须对对象进行降级和转换才能使用子类的方法和属性。
    python:对象在调用父类中方法时,调用的方法和变量都优先调用子类的方法和变量。
    python:天生多态

如果子类重写了父类的方法,那么实例化子类后,调用重写后的方法,调用的是子类的方法还是父类的方法
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show(self):
        print('name is {0},age is {1}'.format(self.name, self.age))


class Work(Person):
    def __init__(self, name, age, salary):
        # super()的方法继承父类的实例属性
        # super().__init__(name, age)
        Person.__init__(self, name, age)
        self.salary = salary

    def show(self):
        print('name is {0},age is {1},salary {2}'.format(self.name, self.age, self.salary))


objPerson = Work(name='admin', age=19, salary=1000.1)
objPerson.show()
    优先调用子类方法

UI自动化测试:
常用的元素定位有那几种方法,请举例说明
在element加s为多种元素定位方法。
一般用于以下场景:
(1)批量操作对象,比如将页面上所有的复选框都被勾选。
(2)先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。
    id | find_element_by_id()
    name | find_element_by_name()
    class name | find_element_by_class_name()
    tag name | find_element_by_tag_name()
    link text | find_element_by_link_text()
    partial link text | find_element_by_partial_link_text()
    xpath | find_element_by_xpath()
    css selector | find_element_by_css_selector()

单个元素定位与多个元素定位的区别是什么?
    单个元素标签用于定位单个元素
    多个元素定位用于定位一组元素

如果是iFrame的框架,如何来定位里面的元素属性的对象
    先进入对应frame框架再定位元素
    frame框架一般通过ID、NAME、索引形式

怎么理解面向对象设计模式
    创建可以跨多个测试用例的共享代码
    减少重复代码
    减少维护成本

怎么理解显式等待和隐式等待
    显示等待:定义了等待条件,只有该条件触发,才执行后续代码。
    隐式等待:尝试发现某个元素的时,如果没立刻发现,就等待固定长度的时间。

在测试中遇到多窗口,具体怎么解决,请描述具体的步骤和编写具体的案例代码
    对A窗口句柄赋值给一个变量
        nowHandler=self.driver.current_window_handle
    对B窗口句柄赋值给一个变量
        allHandlers=self.driver.window_handles
    对窗口句柄进行对比循环到新窗口
        for handler in allHandlers:
            if nowHandler!=handler:
            self.driver.switch_to.window(handler)
    判断窗口是否为预期窗口
            self.assertEqual(self.driver.title,'QQ注册')

单元测试框架:
unittest的常用组件有哪些
test fixture:初始化和清理测试环境
    setUp()和setDown(),
    setUpclass()和setDownclass()最常用的方法
test case:单元测试用例
    TestCase是编写单元测试用例最常用的类
test suite:单元测试用例的集合
    TestSuite 是最常用的类
test runner:执行单元测试
test report:生成测试报告

unittest中怎么理解测试固件
    测试固件是执行测试时的准备工作和收尾工作,测试环境初始化和关闭,数据进行还原操作

怎么理解两种测试固件的区别的测试
    setUp()、setDown()用例类
        打开浏览器输入对应网址这些操作
        给数据还原,这就是执行用例的后置条件。
        对每个用例执行
    setUpclass()和setDownclass()测试类
        打开浏览器输入对应网址这些操作
        给数据还原,这就是执行用例的后置条件。
        对整个测试类执行一次

在unittest测试框架中,加载所有的测试模块使用到的方法是什么?具体参数是什么?
    import unittest
    引入unittest库
    unittest.TestLoader().discover
    获取被执行的测试套件

在unittest中使用那个库来生成对应的测试报告
    引入import HTMLTestRunner.py生成

一个完整的测试用例包含哪些步骤
    测试需求 --> 分析需求 --> 编写用例 --> 划分用例的优先级

怎么理解参数化
    @parameterized.expand([
        param('', '', ''),
        param('', '', ''),
    ])
    测试进行相同的步骤输入的数据不的

测试按阶段划分,主要分为那几个阶段
    单元测试,集成测试,系统测试,验收测试

怎么理解等价类和边界值
    等价类可分为有效等价类、⽆效等价类,是常⽤的⿊盒测试⽤例设计⽅法。
    边界值分析法是作为对等价类划分法的补充,其测试⽤例来⾃等价类的边界。针对某一事物设计他的测试用例

请描述一个完整的测试流程
PRD产品需求文档(交互,逻辑)
    PRD评审
    研发(写代码技术档案,写代码)
    测试(写计划,写方案,写测试用例)
    转测试(冒烟测试,完成,上线)
    开始测试

'''

将数据从测试脚本中分离,减少维护成本

# 创建和
'''
sina.json内容
login:
    notEamil: 请输入邮箱名
    formatEmail: 您输入的邮箱名格式不正确
    errorEmain: 登录名或密码错误
    username: 用户名
    password: 密码
sina.yaml内容
  {
  "login": {
    "notEamil": "请输入邮箱名",
    "formatEmail": "您输入的邮箱名格式不正确",
    "errorEmain": "登录名或密码错误",
    "username": "用户名",
    "password": "密码"
  }
}
'''
# 创建jsonUtils.py,将函数作为数据引入接口
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import json
from uiFrame.utils.pathUtils import filePath


def readJson():
    return json.load(open(filePath(directory='data', fileName='sina.json'), encoding='utf-8'))
# 读取json文件确认编码格式,避免格式不兼容
# 创建yamlUtils.py,将函数作为数据引入接口
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import yaml
from uiFrame.utils.pathUtils import filePath


def readyaml():
    return yaml.load(open(filePath(directory='data', fileName='sina.yaml'), encoding='utf-8'))


def getUrl():
    return yaml.load(open(filePath(directory='config', fileName='config.yaml')))['url']['qa']
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import unittest
from uiFrame.page.sina import Sina
from uiFrame.page.Init import InitSian
# 引入对应的分离数据库
from uiFrame.utils.yamalUtils import readyaml
from uiFrame.utils.jsonUtils import readJson

class SinaTest(InitSian, Sina):
    def test_sina_login_001(self):
        '''登陆验证:用户名密码空'''
        self.login(username='', password='')
        self.assertEqual(self.getDivText, readJson()['login']['notEamil'])

    def test_sina_login_002(self):
        '''登陆验证:用户名不规范'''
        self.login(username='ASDFG', password='ASDFG')
        self.assertEqual(self.getDivText, readJson()['login']['formatEmail'])

    def test_sina_login_003(self):
        '''登陆验证:用户名密码错误'''
        self.login(username='ASDFG@sina.com', password='ASDFG')
        self.assertEqual(self.getDivText, readJson()['login']['errorEmain'])

    def test_sina_login_004(self):
        '''登录判断是否登录'''
        self.login(
            username=readyaml()['login']['username'],
            password=readyaml()['login']['password']
        )
        self.assertEqual(self.getNick, readyaml()['login']['username'])


if __name__ == '__main__':
    unittest.main(verbosity=2)

将测试网站url数据进行分离

创建config.yaml文件写入数据

url:
  qa: https://mail.sina.com.cn/

将测试固件中url参数改为url数据库函数

# !/usr/bin/env python
# -*- coding:utf-8 -*-
import unittest
from selenium import webdriver
from uiFrame.utils.yamalUtils import getUrl

class InitSian(unittest.TestCase):

    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get(getUrl())
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()
pytest简单应用
# !/usr/bin/env python
# -*- coding:utf-8 -*-

def add(a, b):
    return a + b


def test_add_001():
    assert add(1, 2) == 2


def test_add_002():
    assert add('h', 'i') == 'hi'

 

posted @ 2021-08-21 12:32  星德川  阅读(49)  评论(0)    收藏  举报