unittest2是一个单元测试框架
1.导入unittest类库,import unittest
2.def setUp(self) ,每个测试方法前做的预置条件
3.def tear_Down(self) ,每个测试方法执行后要做的场景还原
4.setUpclass(self):执行每个类前要做的预置条件,一个类只执行一遍,这个方法是优先于setup
要加装饰器@classmethod
5.def tearDownClass(sef):执行每个类后的场景还原,一个类只执行一遍,这个方法是仅次于teardown,要加装饰器@classmethod
6.cls表示当前这个类本身,表示这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
# 在类中所有方法前,要执行的预置条件
@classmethod
# cls表示当前这个类本身,表示这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(10)
# 在类中的所有方法后,要执行的场景还原
@classmethod
def tearDownClass(cls):
cls.driver.quit()
7.把重复的代码封装在一个类中,作为一个父类
import unittest2
from selenium import webdriver
import time
# 继承unittest代码库中的TestCase类,表示当前类是一个测试用例类
class BaseTestCase(unittest2.TestCase):
# 在类中所有方法前,要执行的预置条件
@classmethod
# cls表示当前这个类本身,表示我这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(10)
# 在类中的所有方法后,要执行的场景还原
@classmethod
def tearDownClass(cls):
time.sleep(10)
cls.driver.quit()
8.子类去继承父类,如果不在1个脚本里面,要写上引入语句,from 目录名.文件名 import 类名,子类名后面要继承父类名,继承了父类就继承了父类的所有方法,不需要重新写前置方法或后置方法
# 用unittest2测试框架书写注册功能继承父类(重复的测试点)
from testcase.test2 import BaseTestCase
class register(BaseTestCase):
9.元素定位到的是a标签,然后它的父级是一个calss,可以要css_selector来进行元素定位
a:nth-child(1) 是指父节点下的第一个a标签
# 找到了父节点的元素,然后再找子元素,这个子元素是一个a标签,第1个子节点
welcome = self.driver.find_element_by_css_selector(".site-nav-right.fr > a:nth-child(1)").text
print(welcome)
10.找到search搜索按钮元素,并取得这个元素的属性值
# 找到search搜索按钮元素,并取得这个元素的属性值
search = self.driver.find_element_by_css_selector(".btn1").get_attribute("value")
print(search)
11.定义测试类要求必须继承unittest.TestCase类,class 类名(unittest.TestCase):
12.测试方法的名字必须以test_打头,表示这个用例是一个测试用例方法
13.assert断言函数,self.assertIn("用户名已存在",str(response))
self.assertEqual("我的会员中心",self.driver.title)
self.assertEqual("http://127.0.0.1/index.php?m=user&c=index&a=index", self.driver.current_url)
14.操作系统上的路径,获取当前文件所在的路径D:\PythonTest\Selenium Test\func\csvFileManager2.py
运行run_all_cases测试用例集,开始路径不对,会报错,所以要获取当前路径然后替换
获取当前系统路径
base_path = os.path.dirname(__file__)
把当前获取到的路径替换成获取文件的路径以及获取文件方法的路径
path = base_path.replace("func","test_data/" + filename)
15.普通的方法不能被直接运行,只有被调用才能被执行
16.按住ctrl键,可以看到testcase类里面的源代码
17.unittest.main,表示调用unittest的主方法,这样就会执行当前类中的所有方法,根据光标位置的不同,可以选择不同的测试用例
18.测试方法的执行顺序,取决于字母的排列顺序
19.在main函数中直接使用unittest.mian()
# 导入unittest包
import unittest2
class unittest2_text(unittest2.TestCase):
# 在执行每个测试方法前,要做的预置条件
def setUp(self):
print(1)
# 在执行每个测试方法后,要做的场景还原
def tearDown(self):
print(2)
# 在执行每个类前,要做的预置条件,有装饰器
@classmethod
def setUpClass(self):
print(3)
# 在执行每个类后,要做的场景还原,有装饰器
@classmethod
def tearDownClass(self):
print(4)
# 执行方法,方法名前得加test_,这样unittest才会去执行这个方法
def test_login(self):
print(5)
# 执行方法,方法名前如果不加test_,可以通过调用的方式去执行
self.register()
def register(self):
print(6)
def test_login1(self):
print(7)
# 表示调用unittest2的主方法,这样就会执行当前类中的所有方法
if __name__ == '__main__':
unittest2.main()
import unittest2
from selenium import webdriver
# 继承unittest代码库中的TestCase类,表示当前的类是一个测试用例类
class unittest2_text(unittest2.TestCase):
def test_login(self):
self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=login")
self.driver.find_element_by_id("username").send_keys("lala")
self.driver.find_element_by_id("password").send_keys("123456")
self.driver.find_element_by_class_name("login_btn").click()
# 在类中所有方法前,要执行的预置条件
@classmethod
# cls表示当前这个类本身,表示这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(10)
# 在类中的所有方法后,要执行的场景还原
@classmethod
def tearDownClass(cls):
cls.driver.quit()
if __name__ == '__main__':
unittest2.main()
父类脚本
import unittest2
from selenium import webdriver
import time
# 继承unittest代码库中的TestCase类,表示当前类是一个测试用例类
class BaseTestCase(unittest2.TestCase):
# 在类中所有方法前,要执行的预置条件
@classmethod
# cls表示当前这个类本身,表示我这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(10)
# 在类中的所有方法后,要执行的场景还原
@classmethod
def tearDownClass(cls):
time.sleep(10)
子类脚本
# 用unittest2测试框架书写注册功能继承父类(重复的测试点)
from testcase.test2 import BaseTestCase
class register(BaseTestCase):
def test_register(self):
self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=reg")
self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=reg")
self.driver.find_element_by_name("username").send_keys("wuxn")
self.driver.find_element_by_name("password").send_keys("Abc123!")
self.driver.find_element_by_name("userpassword2").send_keys("Abc123!")
self.driver.find_element_by_name("mobile_phone").send_keys("18658194622")
self.driver.find_element_by_name("email").send_keys("[email protected]")
self.driver.find_element_by_class_name("reg_btn").click()
五、注册10个用户,调用csv公共方法,引用testcase的父类
文件管理公共方法
# 建一个文件管理器的公共方法,给定一个文件变量名,比较灵活
# 先过面向过程
# 导入类库
import csv
import unittest
# 文件管理方法
def test_wenjian(filename):
# 给定路径
list=[]
# filename是一个参数,所以要在方法后面加上这个参数
paths=filename
# 遍历完内容,把文件关掉
with open(paths) as file:
# 读取文件里面的内容
rows=csv.reader(file)
# 不读取第一行的内容
i=0
for row in rows:
if i==0:
pass
else:
list.append(row)
i=i+1
# 读完之后,把列表值返回下
print(list)
return list
testcase公共类
# 要被引用的父类脚本
import unittest2
from selenium import webdriver
import time
# 继承unittest代码库中的TestCase类,表示当前类是一个测试用例类
class BaseTestCase(unittest2.TestCase):
# 在类中所有方法前,要执行的预置条件
@classmethod
# cls表示当前这个类本身,表示我这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(10)
# 在类中的所有方法后,要执行的场景还原
@classmethod
def tearDownClass(cls):
time.sleep(10)
cls.driver.quit()
注册10个用户,调用csv公共方法,引用testcase的父类
# 注册10个用户,调用csv公共方法,引用testcase的父类
import ddt
import unittest
# 调用csv公共方法要引入的文件名及方法
from test_5 import test_wenjian
# 引用testcase父类需要引入的目录文件名及方法
from test_4 import BaseTestCase
# 定义注册类
@ddt.ddt()
# 在类前加一个装饰器@ddt.ddt(),表示当前类是一个数据驱动类,类中有测试用例执行不通过时,能进行下一条用例的测试
class regieter(BaseTestCase):
# 给变量文件指定文件名,并读取内容给table
list=test_wenjian('register1.csv')
# 在方法前加上@ddt.data(*table),表示要传的数据不是一个整体,而是按照行数分成行数个变量,通过data
# 方法转换成row
@ddt.data(*list)
def test_register(self,row):
self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=reg")
self.driver.find_element_by_name("username").send_keys(row[0])
self.driver.find_element_by_name("password").send_keys(row[1])
self.driver.find_element_by_name("userpassword2").send_keys(row[2])
self.driver.find_element_by_name("mobile_phone").send_keys(row[3])
self.driver.find_element_by_name("email").send_keys(row[4])
self.driver.find_element_by_class_name("reg_btn").click()
csv文件