# encoding = utf - 8
import unittest
import sys
#被测试类
class myclass(object):
"""classmethod 修饰符对应的函数不需要实例化,
不需要 self 参数,但第一个参数需要是表示自身
类的 cls 参数,可以来调用类的属性,类的方法,
实例化对象等。"""
@classmethod
def sum(cls,a,b):
return a + b #将两个传入参数进行相加操作
@classmethod
def sub(cls, a, b):
return a - b #将两个传入参数进行相减操作
class mytest(unittest.TestCase):
# @classmethod
# def setUpClass(cls):
# """初始化类固件"""
# print("-----setUpClass")
# @classmethod
# def tearDownClass(cls):
# """重构类固件"""
# print("--tearDownClas")
#初始化工作
def setUp(self):
self.a = 3
self.b = 1
print("--setUp")
#退出清理工作
def tearDown(self):
print("--tearDown")
#具体的测试用例,一定要以test开头
def test1sum(self):
# res=3/0 抛出异常,执行结果为F
#断言两数之和的结果是否是4
res=myclass.sum(self.a,self.b)
self.assertEqual(res,4,'test sum fail')
print('testsum方法')
def testsub(self):
#断言两数之差的结果是否是2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('testsub方法')
class aa(unittest.TestCase):
# num=2
# @unittest.skip('skipping')
# @unittest.skipIf(num>1,'num已经大于1')
@unittest.skipUnless(sys.platform == "linux", "requires linux")
def testaa(self):
print('testaa')
if __name__ == '__main__':
# 用例执行(一)执行当前模块中,各类中所有test开头的方法
# unittest.main() #启动单元测试
'''
# 用例执行(二) 使用测试集合可以同时执行统一.py文件中的多个测试用例类
# 根据给定的测试类,获取其中的所有以‘test’开头的测试方法,并返回一个测试集合
testCase1 = unittest.TestLoader().loadTestsFromTestCase(aa)
testCase2 = unittest.TestLoader().loadTestsFromTestCase(mytest)
# 将多个测试类加载到测试集合中
suite = unittest.TestSuite([testCase1, testCase2])
unittest.TextTestRunner().run(suite)
'''
# 用例执行(三)指定用例执行顺序
# 1)获取TestSuite的实例对象
suite = unittest.TestSuite()
# 2)讲测试用例添加到测试容器中
# suite.addTest(mytest("test1sum"))
suite.addTest(aa('testaa'))
# suite.addTest(mytest("testsub"))
# 3)创建TextTestRunner类的实例对象
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
import sys
print(sys.platform)
# 还可以这样写
# suite = unittest.TestSuite()
# cases = [mytest("testsub"), mytest("test1sum"), aa("testaa")]
# suite.addTests(cases)#注意addTests后面有一个s
# runner = unittest.TextTestRunner(verbosity=2)
# runner.run(suite)
PK哥作业
# -*- coding:utf-8 -*-
import unittest
from selenium import webdriver
from time import sleep
'''
Author:pk哥
Date:2019/2/25
'''
driver = webdriver.Chrome()
class MyTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
driver.implicitly_wait(10)
driver.get('http://106.13.46.164:8080/iwebshop/') # 访问乐博商城
driver.maximize_window() # 窗口最大化
driver.find_element_by_xpath('/html/body/div[1]/div[1]/p/a[1]').click() # 点击登录按钮
sleep(0.5)
def setUp(self):
driver.refresh() # 每条案例执行前重新刷新页面
def test_login1(self):
# 账号为空,密码正确
driver.find_element_by_name('login_info').send_keys('')
sleep(0.5)
driver.find_element_by_name('password').send_keys('pk123456')
sleep(0.5)
driver.find_element_by_class_name('submit_login').click()
sleep(0.5)
a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/label')
assert a.text == '填写用户名或邮箱', '提示文案不正确'
sleep(0.5)
driver.get_screenshot_as_file('login1.png')
def test_login2(self):
# 账号正确,密码为空
driver.find_element_by_name('login_info').send_keys('brucepk') # 输入账号
sleep(0.5)
driver.find_element_by_name('password').send_keys('') # 输入密码
sleep(0.5)
driver.find_element_by_class_name('submit_login').click() # 点击登录按钮
sleep(0.5)
a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/label')
assert a.text == '填写密码', '提示文案不正确'
sleep(0.5)
driver.get_screenshot_as_file('login2.png')
def test_login3(self):
# 账号错误,密码正确
driver.find_element_by_name('login_info').send_keys('kkkkkkk') # 输入账号
sleep(0.5)
driver.find_element_by_name('password').send_keys('pk123456') # 输入密码
sleep(0.5)
driver.find_element_by_class_name('submit_login').click() # 点击登录按钮
sleep(0.5)
a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/div').text
self.assertIn('用户名和密码不匹配', a, msg='提示文案校验失败')
sleep(0.5)
driver.get_screenshot_as_file('login3.png')
def test_login4(self):
# 账号正确,密码错误
driver.find_element_by_name('login_info').send_keys('brucepk') # 输入账号
sleep(0.5)
driver.find_element_by_name('password').send_keys('pkpkpkpk') # 输入密码
sleep(0.5)
driver.find_element_by_class_name('submit_login').click() # 点击登录按钮
sleep(0.5)
a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/div').text
self.assertIn('用户名和密码不匹配', a, msg='提示文案校验失败')
sleep(0.5)
driver.get_screenshot_as_file('login4.png')
def test_login5(self):
# 账号错误,密码错误
driver.find_element_by_name('login_info').send_keys('pkkpkpkpkpkp') # 输入账号
sleep(0.5)
driver.find_element_by_name('password').send_keys('pkpkpkpk') # 输入密码
sleep(0.5)
driver.find_element_by_class_name('submit_login').click() # 点击登录按钮
sleep(0.5)
a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/div').text
self.assertIn('用户名和密码不匹配', a, msg='提示文案校验失败')
sleep(0.5)
driver.get_screenshot_as_file('login5.png')
def test_login6(self):
# 账号正确,密码正确
driver.find_element_by_name('login_info').send_keys('brucepk') # 输入账号
sleep(0.5)
driver.find_element_by_name('password').send_keys('pk123456') # 输入密码
sleep(0.5)
driver.find_element_by_class_name('submit_login').click() # 点击登录按钮
sleep(1)
a = driver.find_element_by_class_name('loginfo').text
self.assertIn('brucepk', a, msg='登录失败') # 登录成功文案校验
@classmethod
def tearDownClass(cls):
# 所有案例执行完毕后退出浏览器
driver.quit()
if __name__ == '__main__':
unittest.main()
三米作业
# date: 0226
# name: 三米
import unittest
from selenium import webdriver
from time import sleep
def login(driver,username,password):
driver.find_element_by_link_text("登录").click()
sleep(1)
driver.find_element_by_name("login_info").send_keys(username)
sleep(1)
driver.find_element_by_name("password").send_keys(password)
sleep(1)
driver.find_element_by_class_name("submit_login").click()
class Test_Log(unittest.TestCase):
@classmethod
def setUpClass(cls):
url="http://106.13.46.164:8080/iwebshop/"
cls.driver=webdriver.Chrome()
cls.driver.get(url)
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
@classmethod
def tearDownClass(cls):
sleep(1)
cls.driver.quit()
def setUp(self):
self.driver.refresh()
sleep(1)
def test_login01(self):
login(driver=self.driver,username="sammie",password="000000")
self.ele=self.driver.find_element_by_class_name("loginfo").text
self.assertIn("您好,欢迎您来到", self.ele, "已注册的用户名和正确的密码,登陆异常")
self.driver.find_element_by_link_text("安全退出").click()
print("用例:已注册的用户名和正确的密码")
def test_login02(self):
login(driver=self.driver, username="sammie", password="111111")
self.ele = self.driver.find_element_by_class_name("prompt").text
self.assertEqual("用户名和密码不匹配", self.ele, "已注册的用户名和不正确的密码,登陆异常")
self.driver.get_screenshot_as_file("./image/已注册的用户名和错误的密码.png")
print("用例:已注册的用户名和错误的密码")
def test_login03(self):
login(driver=self.driver, username="sammie7", password="000000")
self.ele = self.driver.find_element_by_class_name("prompt").text
self.assertEqual("用户名和密码不匹配",self.ele,"未注册的用户名和任意密码,登录异常")
self.driver.get_screenshot_as_file("./image/未注册的用户名和任意密码.png")
print("用例:未注册的用户名和任意密码")
def test_login04(self):
login(driver=self.driver, username="", password="000000")
self.ele=self.driver.find_element_by_class_name("invalid-msg").text
self.assertEqual("填写用户名或邮箱",self.ele,"用户名为空,登录异常")
self.driver.get_screenshot_as_file("./image/用户名为空.png")
print("用例:用户名为空")
def test_login05(self):
login(driver=self.driver, username="sammie", password="")
self.ele=self.driver.find_element_by_class_name("invalid-msg").text
self.assertEqual("填写密码",self.ele,"密码为空,登录异常")
self.driver.get_screenshot_as_file("./image/密码为空.png")
print("用例:密码为空")
if __name__ == "__main__":
# unittest.main(verbosity=2)
suite = unittest.TestSuite()
suite.addTest(Test_Log("test_login04"))
suite.addTest(Test_Log("test_login05"))
suite.addTest(Test_Log("test_login02"))
suite.addTest(Test_Log("test_login03"))
suite.addTest(Test_Log("test_login01"))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
运行模块
# encoding=utf-8
import unittest
if __name__=='__main__':
# 批量执行测试模块(一)
# 加载当前目录下所有有效的测试模块,'.'表示当前目录
# 默认加载以test开头的py模块
# testSuite=unittest.TestLoader().discover('.')
# unittest.TextTestRunner(verbosity=2).run(testSuite)
# 批量执行测试模块(一)
# 指定路径及模块关键字 (举例: ../report:表示上一级目录中的report文件夹)
# 代码路径下,加载以lebo开头的py文件(*.py表示指定目录下所有以.py为后缀的文件)
testSuite = unittest.TestLoader().discover(start_dir='.',pattern='lebo*.py')
unittest.TextTestRunner(verbosity=2).run(testSuite)
常用断言
import unittest
import random
#被测试类
class MyClass(object):
@classmethod
def sum(cls,a,b):
return a + b #将两个传入参数进行相加操作
@classmethod
def div(cls, a, b):
return a / b #将两个传入参数进行相除操作
@classmethod
def return_None(cls):
return None
# 单元测试类
class MyTest(unittest.TestCase):
# assertEqual 方法实例
def test_assertEqual(self):
# 断言两数之和的结果
try:
a,b=1,2
sum=13
self.assertEqual(a+b,sum,'断言失败,%s + %s !=%s' %(a,b,sum))
except AssertionError as e:
print(e)
# assertNotEqual 方法实例
def test_assertNotEqual(self):
# 断言两数之差的结果
try:
a, b = 5,2
res = 3
self.assertNotEqual(a - b, res, '断言失败,%s - %s =%s' % (a, b, res))
except AssertionError as e:
print(e)
# assertTrue 方法实例
def test_assertTrue(self):
# 断言表达式为真
try:
self.assertTrue(1==1, "表达式为假")
except AssertionError as e:
print(e)
# assertFalse 方法实例
def test_assertFalse(self):
# 断言表达式为假
try:
self.assertFalse(3==2, "表达式为真")
except AssertionError as e:
print(e)
# assertIs 方法实例
def test_assertIs(self):
# 断言两个变量类型属于同一个对象
try:
a = 12
b = a
self.assertIs(a , b,'%s 与 %s 不属于同一个对象' % (a, b))
except AssertionError as e:
print(e)
# assertIsNot 方法实例
def test_assertIsNot(self):
# 断言两个变量类型不属于同一个对象
try:
a = 12
b = 'test'
self.assertIsNot(a , b,'%s 与 %s 属于同一个对象' % (a, b))
except AssertionError as e:
print(e)
# assertIsNone 方法实例
def test_assertIsNone(self):
# 断言表达式结果为None
try:
result=MyClass.return_None()
self.assertIsNone(result,'not is None')
except AssertionError as e:
print(e)
# assertIsNotNone 方法实例
def test_assertIsNotNone(self):
# 断言表达式结果不为None
try:
result=MyClass.sum(2,5)
self.assertIsNotNone(result,'is None')
except AssertionError as e:
print(e)
# assertIn 方法实例
def test_assertIn(self):
# 断言对象A是否包含在对象B中
try:
strA="this is a test"
strB="is"
self.assertIn(strB,strA,'%s 不包含在 %s中' %(strB,strA))
except AssertionError as e:
print(e)
# assertNotIn 方法实例
def test_assertNotIn(self):
# 断言对象A不包含在对象B中
try:
strA="this is a test"
strB="Selenium"
self.assertNotIn(strB,strA,'%s 包含在 %s中' %(strB,strA))
except AssertionError as e:
print(e)
if __name__=="__main__":
# 执行单元测试
# unittest.main()
testCase = unittest.TestLoader().loadTestsFromTestCase(MyTest)
# 将多个测试类加载到测试集合中
suite = unittest.TestSuite([testCase])
unittest.TextTestRunner(verbosity=1).run(suite)
执行测试并生成测试报告
# encoding = utf - 8
import unittest
import sys
import HTMLTestRunner
import time
import os
#被测试类
class myclass(object):
"""classmethod 修饰符对应的函数不需要实例化,
不需要 self 参数,但第一个参数需要是表示自身
类的 cls 参数,可以来调用类的属性,类的方法,
实例化对象等。"""
@classmethod
def sum(cls,a,b):
return a + b #将两个传入参数进行相加操作
@classmethod
def sub(cls, a, b):
return a - b #将两个传入参数进行相减操作
class mytest(unittest.TestCase):
# @classmethod
# def setUpClass(cls):
# """初始化类固件"""
# print("-----setUpClass")
# @classmethod
# def tearDownClass(cls):
# """重构类固件"""
# print("--tearDownClas")
#初始化工作
def setUp(self):
self.a = 3
self.b = 1
print("--setUp")
#退出清理工作
def tearDown(self):
print("--tearDown")
#具体的测试用例,一定要以test开头
def test1sum(self):
# res=3/0 抛出异常,执行结果为F
#断言两数之和的结果是否是4
res=myclass.sum(self.a,self.b)
self.assertEqual(res,4,'test sum fail')
print('testsum方法')
def testsub(self):
#断言两数之差的结果是否是2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('testsub方法')
class aa(unittest.TestCase):
# num=2
# @unittest.skip('skipping')
# @unittest.skipIf(num>1,'num已经大于1')
@unittest.skipUnless(sys.platform == "linux", "requires linux")
def testaa(self):
print('testaa')
if __name__ == '__main__':
testCase = unittest.TestLoader().loadTestsFromTestCase(mytest)
# 将多个测试类加载到测试集合中
suite = unittest.TestSuite([testCase])
cur_time=time.strftime('%Y-%m-%d_%H_%M_%S')
filename=os.path.dirname(os.path.abspath('.'))+'\\report\\'+cur_time+'.html'
f=open(filename,"wb")
runner=HTMLTestRunner.HTMLTestRunner(stream=f,title="测试报告",description='测试报告描述')
runner.run(suite)