Unittest

一、unittest组成

1、TestCase (最核心的模块)
测试用例,每个TestCase 都是一个代码文件,在这个代码文件中来书写真正的用例代码。
2、TestSuite
测试套件,用来管理、组装(打包)多个TestCase
3、TestRunner
测试执行,用来执行TestSuite
4、TestLoader
测试加载,对TestSuite的补充
5、Fixture
测试夹具,书写在TestCase 代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容

二、测试用例TestCase

  • 测试文件必须先导入import unittest
  • 测试类必须继承unittest.TestCase
  • 测试方法必须以test开头
  • main方法中 unittest.main()

  创建demo.py

  

 1 from time import sleep
 2 from selenium import webdriver
 3 import unittest
 4 
 5 
 6 class TestLogin(unittest.TestCase):
 7 
 8     def setUp(self):
 9         """
10         前置操作
11         :return:
12         """
13         self.driver = webdriver.Chrome()
14         self.driver.get("https://mail.163.com/")
15         self.driver.maximize_window()
16 
17     def tearDown(self):
18         """
19         后置操作
20         :return:
21         """
22         sleep(3)
23         self.driver.quit()
24 
25     def test_login(self):
26         """
27         测试登录
28         :return:
29         """
30 
31         login_action = LoginAction()
32         login_action.login(self.driver, "xiao_wlkq", "1223434")
33         sleep(3)
34         self.assertIn('xiao_wlkq', self.driver.page_source)
35 
36 
37 if __name__ == '__main__':
38     unittest.main()

三、测试套件(TestSuite) & 测试执行(TestRunner)

  创建demo1.py,demo2.py
  创建suite_runner.py

  

四、测试加载TestLoader

1、创建tools.py                                          

                  

 2、创建demo.py

         

  3、使用默认对象的写法

   

   

1 import unittest
2 
3 from POM.Setting.Config import testCase_path
4 
5 if __name__ == '__main__':
6     suit = unittest.TestLoader().discover(testCase_path)
7     unittest.TextTestRunner().run(suit)

 五、测试夹具Fixtrue

  • 模块级(setUpModule/tearDownModule)在模块始末调用
  • 类级(setUpClass/tearDownClass)在类始末调用(在类中)
  • 方法级(setUp/tearDown)在方法始末调用(在类中)

   1、方法级

  

  2、类级

  

  3、模块级

  

六、数据驱动实现

1、导包

import ddt as ddt

2、类前加装饰器@ddt.ddt

  

3、测试方法前加@ddt.data(*testdata)  注意:* 代表拆包的动作

  

 1 from time import sleep
 2 from selenium import webdriver
 3 import unittest
 4 import ddt
 5 
 6 testData = [{'username': 'xiao_wlkq', 'password': '953680003xp@'}]
 7 
 8 @ddt.ddt
 9 class TestLogin(unittest.TestCase):
10 
11     def setUp(self):
12         """
13         前置操作
14         :return:
15         """
16         self.driver = webdriver.Chrome()
17         self.driver.get("https://mail.163.com/")
18         self.driver.maximize_window()
19 
20     def tearDown(self):
21         """
22         后置操作
23         :return:
24         """
25         sleep(3)
26         self.driver.quit()
27 
28     @ddt.data(*testData)
29     def test_login(self, tempdata):
30         """
31         测试登录
32         :return:
33         """
34         username = tempdata["username"]
35         password = tempdata["password"]
36         login_action = LoginAction()
37         login_action.login(self.driver, username, password)
38         sleep(3)
39 
40 if __name__ == '__main__':
41     unittest.defaultTestLoader.discover('./test_login.py', 'test_login.py')

 七、断言方法

1、用assertIn断言页面某个内容是否页面上

self.assertIn("Hi", self.driver.page_source)

八、跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以跳过写在TestCase文件中:

@unittest.skip('跳过的原因') 直接将测试函数标记成跳过
@unittest.skipIf(判断条件,'跳过原因') 根据条件判断测试函数是否跳过

  

九、测试报告

地址:https://i.cnblogs.com/files    HTMLTestRunner-master.zip 解压

  cd /Users/xiao/Desktop/work/1224/HTMLTestRunner-master          

  python setup.py install

import time
import unittest

from TestRunner import HTMLTestRunner

from POM.Setting.Config import testCase_path, testReport_Path

if __name__ == '__main__':
now = time.strftime("%Y.%m.%d %H:%M:%S")
suit = unittest.TestSuite()
loader = unittest.TestLoader()
suit.addTest(loader.discover(testCase_path))

report = "./result.html"
with(open(testReport_Path + '/' + now + '_report.html', 'wb')) as fp:
runner = HTMLTestRunner(
stream=fp,
title='163邮箱登录UI自动化测试报告',
description='浏览器chrome,平台macOS'
)
runner.run(suit)
fp.close()

参考:https://zhuanlan.zhihu.com/p/476379656

十、踩坑

用suite这个地方有好几个坑

1、如果用pycharm,运行时不要点左边的按钮,要注意运行整个py文件,否则可能会执行全部用例

  

2、当用ddt方法时,和TestSuite(suit = unittest.TestSuite()  suit.addTest())加用例时,

运行文件可能会报找不到该用例方法名的错误,原因是用ddt装饰器后会在用例的方法名加一些数据,会导致addTest找不到用例。

  

解决方式:使用unittest.defaultTestLoader.discover() 加载和运行testcase。

posted @ 2022-11-21 14:59  xiao_wlkq  阅读(71)  评论(0)    收藏  举报