Python之Unittest记录

介绍

Unittest是什么?是Python的一款单元测试框架,就是可以对程序员写的代码(类、方法、函数等)进行测试。

官方文档:请点击这里  本文基于该官方文档编写,如有错误,欢迎指出!

直接上代码,文件名:Login.py

import unittest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

class Login(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print('setUpClass执行')
        ser = Service('../chromedriver.exe')
        cls.driver = webdriver.Chrome(service=ser)

    def setUp(self):
        print('setup执行')
        self.driver.get('https://www.baidu.com')

    def test_login_success(self):
        self.driver.find_element(By.CLASS_NAME,'logo_bg').click()
        pass

    @unittest.skip("showing class skipping")
    def test_login_error_password(self):
        pass

    def tearDown(self):
        print('tearDown执行')

    @classmethod
    def tearDownClass(cls):
        print('tearDownClass执行')

def suite():
    suite = unittest.TestSuite()
    suite.addTest(Login('test_login_success'))
    suite.addTest(Login('test_login_error_password'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())
View Code

执行顺序:

setUpClass->
setUp->test_login_success->tearDown->
setUp->test_login_error_password->tearDown->
tearDownClass

注意:

(1)setUpClass和tearDownClass必须加注解@classmethod,表示是一个类的方法,它们在整个过程仅各执行一次,因此可以用来写初始化的代码;

(2)unittest约定,测试用例必须以test开头;

(3)setUp和tearDown在每个测试用例执行前后都会执行,因此可以用来写为用例初始化环境和清理环境的代码;


运行

1、如果用了工具Pycharm,有两种方式可以运行这个测试类,

(1)写个main方法,在Run/Debug  Configurations选择Python,则是运行main中的代码;几种方法:

 1 from class_20220527_requests import TestScore,TestMath
 2 from cdx_test.practise import class_20220527_requests as MD
 3 import unittest
 4 
 5 
 6 if __name__ == '__main__':
 7     # 1、测试套件容器
 8     suite = unittest.TestSuite()
 9 
10     # 2、loader 添加用例的方法:
11     # 2.1:loadTestsFromTestCase,参数为测试类名
12     loader = unittest.TestLoader()
13     s = loader.loadTestsFromTestCase(TestScore)
14     # 2.2:loadTestsFromName:参数1为测试用例,参数2为测试类
15     m = loader.loadTestsFromName('test_Add',TestMath)
16     # 2.3:loadTestsFromName:参数1为测试用例的集合,参数2为测试类
17     ms = loader.loadTestsFromNames(['test_Add', 'test_round'], TestMath)
18     # 2.4:loadTestsFromModule,参数为模块名(1个模块下有多个测试类,我这里是指一个py文件)
19     r = loader.loadTestsFromModule(MD)
20     # 2.5:discover从指定的目录查找并返回其目录下满足条件的所有测试模块
21     cases = loader.discover('../practise',pattern='class_*.py')
22 
23     # 3、测试套件中添加用例
24     # 3.1 从loader中获取,有addTests、addTest两种方法
25     suite.addTests([s,m,ms,r])
26     # suite.addTest(s)
27     # suite.addTest(m)
28     # suite.addTest(ms)
29     # suite.addTest(r)
30     suite.addTest(cases)
31     # 3.2 自己实例化一个测试用例,TestMath是测试类名,test_round是一个具体的测试方法
32     suite.addTest(TestMath('test_round'))
33 
34     # 4、执行测试用例
35     # verbosity 表示测试结果的详细程序,从详细到简单:2 1 0
36     runner = unittest.TextTestRunner(verbosity=2)
37     runner.run(suite)
View Code

 (2)在Pycharm中可以直接运行Login这个类,在类名左侧行号那里有个绿色向右的箭头;

  或在Run/Debug  Configurations选择Python tests,运行;

2、在命令行(Pycharm的Terminal窗口或电脑cmd命令窗口),python -m unittest Login 或 python -m unittest Login.py 都是可以的,意思和上述一样;

其他的命令选项:

  • -h 可以查看所有的命令行选项;python -m unittest -h
  • -v, --verbose Verbose output 详细的输出测试方法 例如 python -m unittest -v test_module
  • -q, --quiet Quiet output 简洁的输出
  • -f, --failfast Stop on first fail or error遇到第一个失败或错误则停止
  • -k  Only run tests which match the given substring 运行与给定子字符串匹配的测试;python -m unittest -k password Login 则只运行test_login_error_password,不运行test_login_success。

 

断言

Unittest的TestCase基类提供的assert*()方法。如果测试失败,异常将被抛出,并带有解释信息,unittest将识别测试用例为失败。任何其他异常将被视为错误。

  .   

写法就是直接 self.assertEqual(1,2)  这样,更多的方法移步官方文档; 

 

子测试subTest

当测试用例之间有非常小的差异时,例如一些参数,unittest可以使用subTest()上下文管理器在测试方法体中区分它们。

class NumbersTest(unittest.TestCase):

    def test_even(self):
        """Test that numbers between 0 and 5 are all even."""
        for i in range(0, 6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
View Code

 

测试套件

测试套件可以用于指定执行哪些用例,比直接执行的方法更灵活一些。代码在介绍中。

 

注解

@unittest.skip(reason) 无条件跳过该测试用例,reason为原因;

@unittest.skipIf(condition, reason)若condition为真,则跳过该测试用例;
Skip the decorated test if condition is true.

@unittest.skipUnless(condition, reason)跳过该用例除非condition为真,意思是condition为真则执行该用例。(这里有点绕)

@unittest.expectedFailure 这个用例希望它失败。如果它本身成功了,则被视为失败;

 

跳过的测试case将不会运行setUp()和tearDown()。被跳过的类将不会运行setUpClass()和tearDownClass()。

 

chromedriver和chrome的版本对应驱动:点击这里

End.

posted @ 2022-04-13 17:22  youreyebows  阅读(56)  评论(0编辑  收藏  举报