在python中的单元测试(二)

1.在单元测试当中的断言的表达方式

1.1assertEqual()

是验证两个人相等,值的是数据类型与内容也是相等的,见案例代码:

复制代码
 1 from selenium import webdriver
 2 import unittest
 3 
 4 class BaiduLogin(unittest.TestCase):
 5     def setUp(self) -> None:
 6         self.driver=webdriver.Chrome()
 7         self.driver.maximize_window()
 8         self.driver.get('https://www.baidu.com/')
 9         self.driver.implicitly_wait(30)
10 
11 
12     def tearDown(self) -> None:
13         self.driver.quit()
14 
15     def test_baidu_login_test(self):
16         '''百度测试:验证百度登录用户信息输入框'''
17         self.driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
18         username=self.driver.find_element_by_id('TANGRAM__PSP_11__userName')
19         self.assertEqual(username.get_attribute('placeholder'),'手机号/用户名/邮箱')
复制代码

1.2assertTrue

返回的是bool类型,也就是对被测试的对象进行验证,如果返回的是boolean类型并且是ture,那么结果验证通过,那么通过asserFlase()验证的是被测试对象返回的内容是false

见案例代码:

复制代码
 1 from selenium import webdriver
 2 import unittest
 3 import time as t
 4 
 5 class SinaLogin(unittest.TestCase):
 6     def setUp(self) -> None:
 7         self.driver=webdriver.Chrome()
 8         self.driver.maximize_window()
 9         self.driver.get('https://mail.sina.com.cn/')
10         self.driver.implicitly_wait(30)
11 
12     def tearDown(self) -> None:
13         self.driver.quit()
14 
15     def test_sina_isLogin(self):
16         '''新浪邮箱验证:判断自动登录是否勾选'''
17         isLogin=self.driver.find_element_by_id('store1')
18         self.assertTrue(isLogin.is_selected())
复制代码

关于asserTrue遵循的规则是真真为真,真假为假,假假为真

1.3assertIn

assertIn()值的是一个值是否包含在另外一个值里面,在这里特别的强调一下,在assertIn的方法里面有两个参数,那么值的包含其实就是第二个实际参数包含第一个实际参数。与之想法的方法是assergNotin(),见案例代码:

复制代码
 1 from selenium import webdriver
 2 import unittest
 3 import time as t
 4 
 5 
 6 class BaiduLogin(unittest.TestCase):
 7     def setUp(self) -> None:
 8         self.driver=webdriver.Chrome()
 9         self.driver.maximize_window()
10         self.driver.get('https://www.baidu.com/')
11         self.driver.implicitly_wait(30)
12 
13 
14     def tearDown(self) -> None:
15         self.driver.quit()
16 
17     def test_baidu_login_null(self):
18         '''百度测试:测试百度登录信息为空的错误信息'''
19         self.driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
20         self.driver.find_element_by_id('TANGRAM__PSP_11__submit').click()
21         divText=self.driver.find_element_by_id('TANGRAM__PSP_11__error')
22         self.assertIn('请您输入手机号/用户名/邮箱',divText.text)
复制代码

1.4在断言中的注意事项

在自动化测试的应用中,测试的结果只有一个,那就是通过或者是不通过,不可能存在可能通过或者可能不通过,测试结果必须是权威的,确定性的

2.在单元测试unittest测试框架 参数化

在unittest测试框架中,参数化使用的库为:parameterized安装方式为:

pip3 install parameterized

参数化:

我们把相同的测试步骤,不同的测试场景,那么我们就可以使用参数化了

 

可以解决的问题就是可以使用少量的测试代码,来覆盖更多的测试场景

代码演示:

复制代码

from selenium import webdriver
import unittest
import time as t
from parameterized import parameterized,param
 1 class SinaLogin(unittest.TestCase):
 2     def setUp(self) -> None:
 3         self.driver=webdriver.Chrome()
 4         self.driver.maximize_window()
 5         self.driver.get('https://mail.sina.com.cn/')
 6         self.driver.implicitly_wait(30)
 7 
 8 
 9     def tearDown(self) -> None:
10         self.driver.quit()
11 
12     @parameterized.expand([
13         param('','','请输入邮箱名'),
14         param('wdasd4','asdwd','您输入的邮箱名格式不正确'),
15         param('sdwd@sina.cn','asdwds','登录名或密码错误')
16     ])
17     def test_sina_login(self,username,password,result):
18         '''新浪登录:判断登录账户为空'''
19         self.driver.find_element_by_id('freename').send_keys(username)
20         t.sleep(5)
21         self.driver.find_element_by_id('freepassword').send_keys(password)
22         t.sleep(5)
23         self.driver.find_element_by_class_name('loginBtn').click()
24         t.sleep(5)
25         divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
26         self.assertEqual(divText.text,result)
复制代码

我们先导入from parameterized import parameterized,param

在上述代码我们可以看到 用到了@parameterized.expand关键词

在进行输入 所对应的元素名称,在上述代码我们分别模拟

不输入用户名密码弹出框的操作、输入邮箱格式不正确弹出框的操作以及输入正确账户密码不对的弹出框的操作。

代码的好处就是可以重复执行一个页面一个模块进行多次调用,减少测试时间

3.关于测试报告的输出 HTMLTestRunner

在我们做完测试报告的时候我们我们将测试结果进行输出运用到的是HTMLTestRunner模块

import HTMLTestRunner

复制代码
 1 import unittest
 2 import os
 3 #HTMLTestRunner可以生成HTML的测试报告
 4 import HTMLTestRunner
 5 
 6 
 7 def getTests():
 8     '''加载所有的测试模块'''
 9     suite=unittest.TestLoader().discover(
10         start_dir=os.path.dirname(__file__),
11         pattern='test_*.py'
12     )
13     return suite
14 
15 def base_dir():
16     return os.path.dirname(os.path.dirname(__file__))
17 #路径返回
18 
19 def run():
20     fp=open(os.path.join(base_dir(),'report','report.html'),'wb')
21     runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='UI自动化测试报告',description='')
22     runner.run(getTests())
复制代码

运行以下进行输出  我们可以看到输出内容

 

在上面的代码我们可以看到运用到了路径的拼接功能,进行输入到写的文件夹,以及输入文件名字

整体的测试报告生成逻辑为:

1、测试报告生成 先执行路径的拼接,输入要写进的文件夹,文件名字,wb=二进制写入

2、进行赋值(引用HTMLTestRunner里面的HTMLTestRunner的方法)(stream=流逝(指的是一个一个进行写入,title=要输出的测试报告名称,description=描述))

3、将赋值后的变量进行run(函数)

4.分离测试套件

我们利用继承的思想分离出测试套件,测试类只需要继承分离的类就可以了,见init.py的源码

复制代码
 1 import unittest
 2 from selenium import webdriver
 3 class Init(unittest.TestCase): 
 4  def setUp(self): 
 5  self.driver=webdriver.Chrome() 
 6  self.driver.implicitly_wait(30) 
 7  self.driver.maximize_window() 
 8  self.driver.get('http://www.baidu.com') 
 9  
10  def tearDown(self): 
11  self.driver.quit()
复制代码

我们看见测试类的源码,只需要继承init类就可以了,见源码:

复制代码
 1 import unittest
 2 from init import Init
 3 class Baidu(Init): 
 4  def test_baidu_title(self):
 5  '''验证:验证百度⾸⻚的title是否正确''' 
 6  self.assertEqual(self.driver.title,'百度⼀下,你就知道') 
 7  
 8  def test_baidu_url(self):
 9  '''验证:验证百度⾸⻚的url是否正确'''
10  self.assertEqual(self.driver.current_url,'https://www.baidu.com/')
11  
12 if __name__ == '__main__': 
13  unittest.main(verbosity=2)
复制代码

 

posted on   钢镚芽儿哟  阅读(115)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示