Web自动化测试-4

1.unittest的内容

1.1TestCase

# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))

import unittest


def add(x, y):
    return x + y


# test无需调用(实例化)
class Test01(unittest.TestCase):
    def test01_add(self):
        result = add(1, 3)
        print(result)
        print("__name__的值:",__name__)

    def test02_add(self):
        result = add(1, 2)
        print(result)


if __name__ == '__main__':
    unittest.main()
    # __name__的值分为模块名和__main__

1.2TestSuite,TextTestRunner

# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))

import unittest
from script03.test01_Unittest_TestCase import Test01

# 实例化
suite = unittest.TestSuite()

# 调用增加方法,类名(“方法名”)
# 方法一
# suite.addTest(Test01("test01_add"))
# suite.addTest(Test01("test02_add"))
# 方法二
# 选中所有以test开头的方法
suite.addTest(unittest.makeSuite(Test01))

# 实例化
runner = unittest.TextTestRunner()
# 以文本的形式执行测试套件
runner.run(suite)

1.3TestLoader

# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))

import unittest

# TestLoader()批量执行以什么开头的模块文件
# /cases路径,test*.py表示以test开头的py文件
suite = unittest.TestLoader().discover("cases", pattern="test*.py")
# defaultTestLoader===TestLoader()
# defaultTestLoader是将TestLoader()实例化了
# suite=unittest.defaultTestLoader.discover("/cases",pattern="test*.py")

unittest.TextTestRunner().run(suite)

# TestLoader与TestSuite都是测试套件,但实现方法不同
# TestLoader为批量执行以什么开头的模块文件
# TestSuite要么添加类中所有的test方法,要么添加其中的某个,而且还需要导包

1.4Fixture

# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))

import unittest


# fixture的级别,函数级别,类级别,模块级别

# 模块级别(基本不用,知道就行)
def setUpModule():
    print("setUpModule..")


def tearDownModule():
    print("tearDownModule..")


# 无论是类级别还是函数级别都是以下用途
# setUp与setUpClass初始化:1.获取浏览器实例化对象,2.最大化浏览器,3.隐式等待
# tearDown与tearDownClass结束:关闭浏览器驱动对象
class Test01(unittest.TestCase):

    # 类级别
    @classmethod
    def setUpClass(cls):
        print("setUpClass...")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass..")

    def setUp(self):
        print("setup...")

    def tearDown(self):
        print("tearDown..")

    # 函数级别
    def test01(self):
        print("test01..")

    def test02(self):
        print("test02..")

    def test03(self):
        print("test03..")


1.5assert

import time
import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By


# def test001(self):
#     # 是否为True,false
#     self.assertTrue()
#     self.assertFalse()
#     # assertEqual()是否相等
#     self.assertEqual()
#     self.assertNotEqual()
#     # assertIn方法判断后面的字符串是否包含前面的字符串
#     self.assertIn("xxx", "xxxx")
#     self.assertNotIn()
#     # 是否为空
#     self.assertIsNone()

class Test01(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Edge()
        self.driver.get("https://www.tp-shop.cn/")
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)

    def tearDown(self):
        sleep(2)
        self.driver.quit()

    def test001(self):
        driver = self.driver
        sleep(1)
        driver.find_element(By.PARTIAL_LINK_TEXT, "登录").click()
        sleep(1)
        driver.find_element(By.CSS_SELECTOR, "[name='username']").send_keys("13800001111")
        sleep(1)
        driver.find_element(By.CSS_SELECTOR, "[name='password']").send_keys("123456")
        sleep(1)
        driver.find_element(By.CSS_SELECTOR, "#login-ver").send_keys("xxx")
        sleep(1)
        # 这里不知道为啥.login-btn对,input[value=''登录]错
        driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
        sleep(1)
        result = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
        print(result)
        expect_result = "验证码错误!!"
        try:
            # 当实际结果与预期结果不同时截屏
            self.assertEqual(result, expect_result)
        except AssertionError:
            # driver.get_screenshot_as_file("../image/%s.png" % (time.strftime("%Y_%m_%d_%H_%M_%S")))
            driver.get_screenshot_as_file("../image/{}.png" .format(time.strftime("%Y_%m_%d_%H_%M_%S")))

# python自带的assert(不用python的unittest模块)
# assert "hello" == "hello"
# assert "h" in "hello"

1.6参数化

test.json为:

[
  {
    "username": "13800001111",
    "password": "123456",
    "loginver": "xx",
    "expect_result" : "验证码错误!!"
  },
    {
    "username": "",
    "password": "123456",
    "loginver": "xx",
    "expect_result" : "验证码错误!!"
  }
]
import json
import time
import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from parameterized import parameterized


def build_data():
    with open('test.json', encoding='utf-8') as f:
        result = json.load(f)
        data = []
        for i in result:
            # 这里一定要注意,要把每次添加的数据转化为元组,不然会报错
            # 报错的原因是因为parameterized只能支持每组数据是元组
            data.append((i.get('username'), i.get('password'), i.get('loginver'),i.get('expect_result')))
    return data


# unittest无法实现参数化,需要安装parameterized
class Test01(unittest.TestCase):

    # setUp在有多个测试用例的时候需要启动多次浏览器,这很不方便,故,可以使用setUpClass,但要注意清空
    def setUp(self):
        self.driver = webdriver.Edge()
        self.driver.get("https://www.tp-shop.cn/")
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)

    # tearDown也要换为tearDownClass
    def tearDown(self):
        sleep(2)
        self.driver.quit()

    # 单个参数["1","2","3"],多个参数[(1,2,3),(1,2,3),(1,2,3)]
    @parameterized.expand(build_data())
    def test001(self,username,password,loginver,expect_result):
        driver = self.driver
        sleep(1)
        driver.find_element(By.PARTIAL_LINK_TEXT, "登录").click()
        sleep(1)
        driver.find_element(By.CSS_SELECTOR, "[name='username']").send_keys(username)
        sleep(1)
        driver.find_element(By.CSS_SELECTOR, "[name='password']").send_keys(password)
        sleep(1)
        driver.find_element(By.CSS_SELECTOR, "#login-ver").send_keys(loginver)
        sleep(1)
        # 这里不知道为啥.login-btn对,input[value=''登录]错
        driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
        sleep(1)
        result = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
        print(result)
        # expect_result = "验证码错误!!"
        try:
            self.assertEqual(result, expect_result)
        except AssertionError:
            # driver.get_screenshot_as_file("../image/%s.png" % (time.strftime("%Y_%m_%d_%H_%M_%S")))
            # {}与.format()
            driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值