12.7

 

test登录实战

from selenium import webdriver
import unittest
import time as t

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

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

	def test_baidu_username_text(self):
		'''百度测试:验证百度登录用户输入框的信息'''
		t.sleep(3)
		self.driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
		username=self.driver.find_element_by_id('TANGRAM__PSP_11__userName')
		self.assertEqual(username.get_attribute('placeholder'),'手机号/用户名/邮箱')


	def test_baidu_username_null(self):
		'''百度测试:验证百度登录信息为空的错误信息'''
		t.sleep(3)
		self.driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
		self.driver.find_element_by_id('TANGRAM__PSP_11__submit').click()
		divText=self.driver.find_element_by_id('TANGRAM__PSP_11__error')
		t.sleep(3)
		self.assertIn('请您输入手机号',divText.text)

  

分离测试套件

在一个自动化测试用例中,测试用例是按照业务模块来进行划分的,那么就会编写很多的模块,就会存在重复的代码。

不管是测试什么模块,测试固件这部分的代码每个测试模块都是一样的,这样就导致很多的重复的代码,比如需要修改测试的地址,就需要修改很多的测试模块,但是如果把测试套件分离出来,我们这需要修改一个地方就可以了,测试固件分离到init.py里面。

from selenium import webdriver
import unittest

class Init(unittest.TestCase):
	@classmethod
	def setUpClass(cls) -> None:
		cls.driver=webdriver.Chrome()
		cls.driver.get('https://www.baidu.com')
		cls.driver.maximize_window()
		cls.driver.implicitly_wait(30)

	@classmethod
	def tearDownClass(cls) -> None:
		cls.driver.quit()

  

参数化

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

安装方式为:pip3 install parameterized

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

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

参数化前

from selenium import webdriver
import unittest
import time as t

class SinaLogin(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_sinan_null(self):
		'''sina邮箱验证:登录账户为空'''
		self.driver.find_element_by_id('freename').send_keys('')
		self.driver.find_element_by_class_name('loginBtn').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_sinan_email_format(self):
		'''sina邮箱验证:登录邮箱格式不正确'''
		self.driver.find_element_by_id('freename').send_keys('qwert')
		self.driver.find_element_by_class_name('loginBtn').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_sinan_username_error(self):
		'''sina邮箱验证:登录账户不匹配'''
		self.driver.find_element_by_id('freename').send_keys('qwert@sina.cn')
		self.driver.find_element_by_id('freepassword').send_keys('zxcvb')
		self.driver.find_element_by_class_name('loginBtn').click()
		t.sleep(3)
		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,'登录名或密码错误')

  

参数化

from selenium import  webdriver
import  unittest
import  time as t
from parameterized import  parameterized,param

class SinaLogin(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('qwert','asdf','您输入的邮箱名格式不正确'),
		param('qwert@sina.cn','asdfg','登录名或密码错误')
	])
	def test_sina_login(self,username,password,result):
		self.driver.find_element_by_id('freename').send_keys(username)
		t.sleep(3)
		self.driver.find_element_by_id('freepassword').send_keys(password)
		t.sleep(3)
		self.driver.find_element_by_class_name('loginBtn').click()
		t.sleep(3)
		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,result)

  

测试报告

我们在tests的模块下编写了很多的测试用例,但是实际的生产环境中总不能按测试模块来执行,我们都是加载所有的测试模块来执行并且最终生成基于HTML的测试报告,测试报告会使用到第三方的库HTMLTestRunner

下载的地址为:https://github.com/tungwaiyip/HTMLTestRunner

把该模块需要放在lib的目录下

import unittest
import os
# HTMLTestRunner可以生成HTML的测试报告
import  HTMLTestRunner

def getTests():
	'''加载所有的测试模块'''
	suite=unittest.TestLoader().discover(
		# 找到被执行模块的路径
		start_dir=os.path.dirname(__file__),
		# 加载路径下所有一test_开头的测试模块的文件
		pattern='test_*.py'
	)
	return suite

def base_dir():
	return  os.path.dirname(os.path.dirname(__file__))

def run():
	fp=open(os.path.join(base_dir(),'report','report.htm'),'wb')
	runner=HTMLTestRunner.HTMLTestRunner(
		stream=fp,
		title='UI自动化测试报告',
		description=''
	)
	runner.run(getTests())

if __name__ == '__main__':
    run()

  

 测试报告文件名加入时间

import unittest
import os
# HTMLTestRunner可以生成HTML的测试报告
import  HTMLTestRunner
import time

def getTests():
	'''加载所有的测试模块'''
	suite=unittest.TestLoader().discover(
		# 找到被执行模块的路径
		start_dir=os.path.dirname(__file__),
		# 加载路径下所有一test_开头的测试模块的文件
		pattern='test_*.py'
	)
	return suite

def getNowTime():
	return time.strftime('%y-%m-%d %H-%M-%S',time.localtime(time.time()))

def base_dir():
	return  os.path.dirname(os.path.dirname(__file__))

def run():
	fp=open(os.path.join(base_dir(),'report',getNowTime()+'report.htm'),'wb')
	runner=HTMLTestRunner.HTMLTestRunner(
		stream=fp,
		title='UI自动化测试报告',
		description=''
	)
	runner.run(getTests())

  

posted @ 2021-12-07 19:35  高。  阅读(164)  评论(0)    收藏  举报