unittest(1)

unittest单元测试框架

一、测试金字塔模型

UI层:可以理解为功能测试;

service:接口测试(API);

Unit(单元测试)。

 

 

**二、白盒测试**

在软件架构,测试最核心的步骤是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们称为白盒测试。

在自动化测试过程中,编写的每一个测试用例都是需要借助单元测试框架的,在Python技术栈中,单元测试框架主要是unittest和Pytest,Java技术栈里面主要使用的是junit和testng。

 

 

三、单元测试步骤:

设置:(初始化获取浏览器驱动对象driver,打开网页、最大化浏览器、隐式等待)

测试:步骤

断言: 验证 assert

清理:(关闭浏览器)

unittest是单元测试框架,使用它的注意事项:

1、测试类以Test开头 2、每个测试类必须要继承unittest模块中的TestCase类,这样就可以直接调用里面的方法 3、在测试类里面编写的方法叫测试方法,测试方法必须是以test开头的

所有的测试用例都必须在test包下,每个测试模块都应该是以test_模块名称来命名 每个测试类都建议Test开头,每个测试方法必须是以test开头

举例:

class TestAdd(unittest.TestCase):
# TestAdd是类,类继承unittest下的TestCase
    def test_add_int(self):
        assert add(5,6)==11

if __name__==" main ":
    # 执行全部 验证
    unittest.main()

 

 四、单元测试框架包括

 

 

测试用例(TestCase):就是测试类里面编写的测试方法
测试固件:初始化setUp(),清理tearDown()
测试套件(TestSuite):测试用例的集合,在一个测试套件可以有很多的测试用例
测试执行(TestRunner):执行测试套件或者测试用例
测试报告(TestReport):就是执行所有测试用例后的结果信息

五、断言

以百度为例

class TestBaidu(unittest.TestCase):
   def setUp(self) -> None:
      self.driver=webdriver.Chrome()
      self.driver.maximize_window()
      self.driver.get("https://www.baidu.com")
      self.driver.implicitly_wait(30)

   def tearDown(self) -> None:
      self.driver.quit()

   def test_baidu_title(self):
      assert self.driver.title == "百度一下,你就知道"

   def test_baidu_url(self):
      assert self.driver.current_url=="https://www.baidu.com"

   def test_baidu_so(self):
      so=self.driver.find_element(By.ID,"kw")
      so.send_keys("奋斗史")
      assert so.get_attribute("value")=="奋斗史"
      
if __name__ == '__main__':
        unittest.main()

 

 

六、测试固件

assertEqual():比较两个对象的==关系 assertIn():比较两个对象的包含关系 assertIs():比较两个字符串的内存地址

以百度为例

class TestBaidu(unittest.TestCase):
   def setUp(self) -> None:
      self.driver=webdriver.Chrome()
      self.driver.maximize_window()
      self.driver.get("https://www.baidu.com/")
      self.driver.implicitly_wait(30)
   def tearDown(self) -> None:
      self.driver.quit()

   def test_baidu_title(self):
      assert self.driver.title == "百度一下,你就知道"

   def test_baidu_url(self):
      assert self.driver.current_url=="https://www.baidu.com/"

   def test_baidu_so(self):
      so=self.driver.find_element(By.ID,"kw")
      so.send_keys("奋斗史")
      self.assertEqual(so.get_attribute("value"),"奋斗史")

   def test_baidu_enble(self):
      so=self.driver.find_element(By.ID,"kw")
      self.assertTrue(so.is_enabled())

   def test_baidu_enble(self):
      so=self.driver.find_element(By.LINK_TEXT,"关于百度")
      self.assertTrue(so.is_displayed())
   if __name__=="main":
      unittest.main()

 

 

测试固件:

1、setUp() and tearDown():在一个测试类里面,有多少个测试用例,它就会被执行多少次 2、setUpClass() and tearDownClass():是类方法,不管测试类里面有多少测试用例,它只会执行一次

以新浪邮箱为例,登录错误信息验证

import  time as t

class TestSina(unittest.TestCase):
   def setUp(self) -> None:
      self.driver=webdriver.Chrome()
      self.driver.maximize_window()
      self.driver.get("https://mail.sina.com.cn/")
      self.driver.implicitly_wait(30)

   def tearDown(self) -> None:
      self.driver.quit()

   def test_username_null(self):
      '''验证空名'''
      self.driver.find_element(By.LINK_TEXT,"登录").click()
      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]")
      self.assertEqual(DivText.text,"请输入邮箱名")

   def test_email_format(self):
      '''验证输入格式不正确'''
      self.driver.find_element(By.ID,"freename").send_keys("hjk")
      self.driver.find_element(By.ID,"freepassword").send_keys("hjkl")
      self.driver.find_element(By.LINK_TEXT,"登录").click()
      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]")
      self.assertEqual(divText.text, "您输入的邮箱名格式不正确")

   def test_username_passwd_error(self):
      '''验证登录密码错误'''
      self.driver.find_element(By.ID,"freename").send_keys("hjk@sina.com")
      self.driver.find_element(By.ID,"freepassword").send_keys("hjkl123")
      self.driver.find_element(By.LINK_TEXT,"登录").click()
      t.sleep(2)
      ddText=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]")
      self.assertEqual(ddText.text,"登录名或密码错误")
if __name__ == '__main__':
   unittest.main()

 

 七、参数化:

当一个测试场景测试步骤相同,测试数据不一样的时候,就可以使用参数化,在unittest测试框架中,参数化需要借

from selenium import  webdriver
import  time as t
from selenium.webdriver.common.by import By
from parameterized import  parameterized,param
import  unittest

class TestSina(unittest.TestCase):
   def setUp(self) -> None:
      self.driver=webdriver.Chrome()
      self.driver.maximize_window()
      self.driver.get("https://mail.sina.com.cn/#")
      self.driver.implicitly_wait(30)

   def tearDown(self) -> None:
      self.driver.quit()

   @parameterized.expand([
      # 验证登录错误信息
      param("", "", "请输入邮箱名"),
      param("asf", "tgfrds", "您输入的邮箱名格式不正确"),
      param("as2t@sina.com", "hgfd", "登录名或密码错误")
   ])
   def test_username_passwd_error(self,username,password,result):
      self.driver.find_element(By.ID, 'freename').send_keys(username)
      self.driver.find_element(By.ID, 'freepassword').send_keys(password)
      self.driver.find_element(By.LINK_TEXT,"登录").click()
      t.sleep(3)
      ddText=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]")
      print(ddText.text)
      self.assertEqual(ddText.text,result)
if __name__ == '__main__':
   unittest.main()

 

 

八、测试套件

测试执行原则:自动寻找到被执行的测试模块,根据测试模块寻找到测试类中符合要求的测试方法来进行执行

import unittest
import os
def allTest():
   suite=unittest.TestLoader().discover(
      # start_dir 测试模块的路径
      start_dir=os.path.dirname(__file__),
      # pattern 通过正则方式加载所有的测试模块
      pattern="test_*.py")
   return suite

 

 

九、测试报告

unittest生成测试报告需要借助第三方的库HtmlTestRunner.py的文件助第三方的库parameterized

把该库(HTMLTestRunner)放在Python安装的lib目录下。

 

 

 

 

 

posted @ 2022-06-30 19:52  Yvonne_26J  阅读(33)  评论(0)    收藏  举报