Python+Selenium自动化测试(四):unittest

一、unittest之执行顺序

举例:

import unittest

class Test(unittest.TestCase):
    def setUp(self):
        print("start!")
    def tearDown(self):
        print("end!")
    def test01(self): # 仅执行test开头用例
        print("执行测试用例01")
    def test03(self):
        print("执行测试用例03")
    def test02(self):
        print("执行测试用例02")

if __name__ == "__main__":
    unittest.main()

结果:
start!
执行测试用例01
end!
start!
执行测试用例02
end!
start!
执行测试用例03
end!

一、unittest之装饰器

①装饰器

  • 用setUp与setUpClass区别

setup():每个测试case运行前运行
teardown():每个测试case运行完后执行
setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次
tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次

  • @是修饰符,classmethod是python里的类方法

②执行顺序

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("start!")

    @classmethod
    def tearDownClass(cls):
        print("end!")

    def test01(self):
        print("执行测试用例01")

    def test03(self):
        print("执行测试用例03")

    def test02(self):
        print("执行测试用例02")

if __name__ == "__main__":
    unittest.main()

结果:
start!
end!
进程已结束,退出代码为 0
执行测试用例01
执行测试用例02
执行测试用例03
③unittest装饰器
unittest本身也带有装饰器unittest.skip(),专门用于跳过testcase的装饰器,其用法如下:

@unittest.skip(reason), skip装饰器:直接跳过装饰下的testcase,reason用来说明原因,下同。

@unittest.skipIf(condition,reason), skipIf装饰器:condition条件为True时,跳过装饰下的testcase,计入skip的testcase执行次数。

@unittest.skipUnless(condition,reason),skipUnless装饰器:condition条件为False时,跳过装饰下的testcase,计入skip的testcase执行次数。

@unittest.expectedFailure(), expectedFailure装饰器:执行装饰下的testcase,执行失败则跳过该testcase,计入expected下成败的testcase次数。
一、unittest之断言
  • .assertEqual(self, first, second,msg=None)
    –判断两个参数相等:first == second
  • .assertNotEqual(self, first, second,msg=None)
    –判断两个参数不相等:first != second
  • .assertIn(self, member, container,msg=None)
    –判断是字符串是否包含:member in container
  • .assertNotIn(self, member,container, msg=None)
    –判断是字符串是否不包含:member not in container
  • .assertTrue(self, expr, msg=None)
    –判断是否为真:expr is True
  • .assertFalse(self, expr, msg=None)
    –判断是否为假:expr is False
  • .assertIsNone(self, obj, msg=None)
    –判断是否为None:objis None
  • .assertIsNotNone(self, obj,msg=None)
    –判断是否不为None:obj is not None
一、unittest之模块导入

以登录博客园为案例https://passport.cnblogs.com/user/signin
一、登录方法封装
把登录写成一个登录类,里面写个登录的方法,保存文件为login_public.py

'''
登录博客园的类及方法
'''

class Login_Blog():
    '''登录类封装'''

    def __init__(self, driver):
        '''初始化driver参数'''
        self.driver = driver

    def input_user(self, username):
        '''输入用户名'''
        self.driver.find_element_by_id("mat-input-0").clear()
        self.driver.find_element_by_id("mat-input-0").send_keys(username)

    def input_psw(self, psw):
        '''输入密码'''
        self.driver.find_element_by_id("mat-input-1").clear()
        self.driver.find_element_by_id("mat-input-1").send_keys(psw)

    def click_button(self):
        '''点击登录按钮'''
        self.driver.find_element_by_xpath("//*[text()=' 登录 ']").click()

    def login(self, username, psw):
        '''登录公共方法'''
        self.input_user(username)
        self.input_psw(psw)
        self.click_button()

二、调用方法

from selenium import webdriver
import unittest
from time import sleep
from login_public import Login_Blog

class TestLogin(unittest.TestCase):
    def setUp(self):
        url = "https://passport.cnblogs.com/user/signin"
        self.driver = webdriver.Chrome()
        self.driver.get(url)

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

    def test_login(self):
        # 调用登录类里面的login方法
        Login_Blog(self.driver).login("Hello_Now", "密码")
        sleep(3)
        # 点击头像
        self.driver.find_element_by_id("user_icon").click()
        myurl = self.driver.current_url
        print(myurl)
        self.assertEqual(myurl,"https://home.cnblogs.com/u/hello-now",msg="登录失败")


if __name__ == "__main__":
    unittest.main()
一、unittest之批量执行

diascover加载测试用例:
1.discover方法里面有三个参数:

-case_dir:这个是待执行用例的目录。
-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。

import unittest
import os
import time
# import HTMLTestRunner
# 用例路径
case_path = os.path.join(os.getcwd(),"Cases")
# 执行什么用例:test开头的py脚本
yongli = "test*.py"
# 报告存放路径
report_path = os.path.join(os.getcwd(),"report")

def all_case():
    rong = unittest.defaultTestLoader.discover(case_path,yongli,top_level_dir=None)
    print(rong)
    return rong

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(all_case())
一、unittest之HTMLTestRunner测试报告

①下载HTMLTestRunner:地址
②放入python安装目录下:
在这里插入图片描述
③代码:

import unittest
import os
import time
import HTMLTestRunner
# 用例路径
case_path = os.path.join(os.getcwd(),"Cases")
# 执行什么用例:test开头的py脚本
yongli = "test*.py"
# 报告存放路径
report_path = os.path.join(os.getcwd(),"report")

def all_case():
    rong = unittest.defaultTestLoader.discover(case_path,yongli,top_level_dir=None)
    print(rong)
    return rong


if __name__ == '__main__':
    # 获取当前时间
    nowtime = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
    # html报告文件路径
    report_abspath = os.path.join(report_path,"测试报告_"+nowtime+".html")
    # 打开文件,将结果写入文件中
    fp = open(report_abspath, "wb")
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=r'自动化测试报告:', description=r'用例执行情况:')
    # 4、调用all_case函数返回值
    runner.run(all_case())
    fp.close()

④样式展示:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值