第8章——自动化测试综合实战

自动化测试综合实战

项目背景

http://localhost/news/ 新闻子页面进行登录测试。

功能实现

· 自动运行用例

· 自动生成测试报告

· 自动断言与截图

· 自动将最新测试报告发送到指定邮箱

· PageObject+Unittest

项目架构

 

浏览器driver定义

from selenium import webdriver

#启动浏览器驱动

def browser():

driver = webdriver.Firefox()

# driver = webdriver.Chrome()

# driver = webdriver.Ie()

# driver=webdriver.PhantomJS()

# driver.get("http://www.baidu.com")

return driver

#调试运行

if __name__ == '__main__':

browser()

用例运行前后的环境准备工作

import unittest

from driver import *

class StartEnd(unittest.TestCase):

def setUp(self):

self.driver=browser()

self.driver.implicitly_wait(10)

self.driver.maximize_window()

def tearDown(self):

self.driver.quit()

工具方法模块(截图,查找最新报告、邮件发送)

from  selenium import webdriver

import os

import smtplib

from email.mime.text import MIMEText

from email.header import Header

#截图方法

def inser_img(driver,filename):

#获取当前模块所在路径

func_path=os.path.dirname(__file__)

# print("func_path is %s" %func_path)

#获取test_case目录

base_dir=os.path.dirname(func_path)

# print("base_dir is %s" %base_dir)

#将路径转化为字符串

base_dir=str(base_dir)

#对路径的字符串进行替换

base_dir=base_dir.replace('\\','/')

# print(base_dir)

#获取项目文件的根目录路径

base=base_dir.split('/Website')[0]

# print(base)

#指定截图存放路径

filepath=base+'/Website/test_report/screenshot/'+filename

# print(filepath)

driver.get_screenshot_as_file(filepath)

#查找最新的测试报告

def latest_report(report_dir):

lists = os.listdir(report_dir)

# print(lists)

lists.sort(key=lambda fn: os.path.getatime(report_dir + '\\' + fn))

# print("the latest report is " + lists[-1])

file = os.path.join(report_dir, lists[-1])

# print(file)

return file

#将测试报告发送到邮件

def send_mail(latest_report):

f=open(latest_report,'rb')

mail_content=f.read()

f.close()

smtpserver = 'smtp.163.com'

user = 'yuexiaolu2015@163.com'

password = '...'

sender = 'yuexiaolu2015@163.com'

receives = ['yuexiaolu2015@126.com', 'yuexiaolu2015@sina.com']

subject = 'Web Selenium 自动化测试报告'

msg = MIMEText(mail_content, 'html', 'utf-8')

msg['Subject'] = Header(subject, 'utf-8')

msg['From'] = sender

msg['To'] = ','.join(receives)

smtp = smtplib.SMTP_SSL(smtpserver, 465)

smtp.helo(smtpserver)

smtp.ehlo(smtpserver)

smtp.login(user, password)

print("Start send email...")

smtp.sendmail(sender, receives, msg.as_string())

smtp.quit()

print("Send email end!")

if __name__ == '__main__':

driver=webdriver.Firefox()

driver.get("http://www.sogou.com")

inser_img(driver,"sogou.png")

driver.quit()

Pageobject页面对象封装

BasePage.py —— 基础页面类

from  time import sleep

class Page():

def __init__(self,driver):

self.driver=driver

self.base_url="http://localhost"

self.timeout=20

def _open(self,url):

url_=self.base_url+url

print('Test page is:%s' %url_)

self.driver.maximize_window()

self.driver.get(url_)

sleep(2)

assert self.driver.current_url == url_, 'Did ont land on %s' % url_

def open(self):

self._open(self.url)

def find_element(self,*loc):

return self.driver.find_element(*loc)

LoginPage.py —— 新闻登录页面

from  PageBase import *

from selenium import webdriver

from  selenium.webdriver.common.by import By

class LoginPage(Page):

'''新闻登录页面'''

url = '/news/'

# 定位器——对相关元素进行定位

username_loc = (By.NAME, 'username')

password_loc = (By.NAME, 'password')

submit_loc = (By.NAME, 'Submit')

def type_username(self, username):

self.find_element(*self.username_loc).clear()

self.find_element(*self.username_loc).send_keys(username)

def type_password(self, password):

self.find_element(*self.password_loc).clear()

self.find_element(*self.password_loc).send_keys(password)

def type_submit(self):

self.find_element(*self.submit_loc).click()

def Login_action(self,username,password):

self.open()

self.type_username(username)

self.type_password(password)

self.type_submit()

LoginPass_loc = (By.LINK_TEXT, '我的空间')

loginFail_loc = (By.NAME, 'username')

def type_loginPass_hint(self):

return self.find_element(*self.LoginPass_loc).text

def type_loginFail_hint(self):

return self.find_element(*self.loginFail_loc).text

test_login.py ——unittest组织测试用例

· 用户名密码正确点击登录

· 用户名正确,密码错误点击登录

· 用户名和密码为空点击登录

import unittest

from model import function,myunit

from page_object.LoginPage import *

from time import sleep

class LoginTest(myunit.StartEnd):

# @unittest.skip('skip this case')

def test_login1_normal(self):

'''username password is normal'''

print("test_login1_normal is start run...")

po=LoginPage(self.driver)

po.Login_action('51zxw',123456)

sleep(3)

#断言与截屏

self.assertEqual(po.type_loginPass_hint(),'我的空间')

function.insert_img(self.driver,"51zxw_login1_normal.jpg")

print("test_login1_normal is test end!")

def test_login2_PasswdError(self):

'''username is ok,passwd is error!'''

print("test_login2_PasswdError is start run...")

po=LoginPage(self.driver)

po.Login_action("51zxw",12342)

sleep(2)

self.assertEqual(po.type_loginFail_hint(),'')

function.insert_img(self.driver,"51zxw_login2_fail.jpg")

print("test_login2_PasswdError is test end!")

#

# @unittest.skip

def test_login3_empty(self):

'''username password is empty'''

print("test_login3_empty is start run...")

po=LoginPage(self.driver)

po.Login_action('','')

sleep(2)

#断言与截屏

self.assertEqual(po.type_loginFail_hint(),'')

function.insert_img(self.driver,"51zxw_login3_empty.jpg")

print("test_login3_empty is test end!")

if __name__ == '__main__':

unittest.main()

run_test.py——执行测试用例

import unittest

from  function import *

from BSTestRunner import BSTestRunner

import time

report_dir = './test_report'

test_dir = './test_case'

print("start run testcase...")

discover = unittest.defaultTestLoader.discover(test_dir, pattern="test_login.py")

now = time.strftime("%Y-%m-%d %H_%M_%S")

report_name = report_dir + '/' + now + 'result.html'

print("start write report...")

# 运行前记得把BSTestRunner.py 120行'unicode’ 换成'str’

with open(report_name, 'wb') as f:

runner = BSTestRunner(stream=f, title="Test Report", description="localhost login test")

runner.run(discover)

f.close()

print("find latest report...")

# 查找最新的测试报告

latest_report = latest_report(report_dir)

# 邮件发送报告

print("send email report...")

send_mail(latest_report)

print("test end!")

浏览器内核

Webkit:目前最主流的浏览器内核,webkit是苹果公司开源的浏览器内核,其前身是KHTML。基于Webkit的浏览器很多,比如Safari,Chrome,Opera

Gecko:是Firefox浏览器的内核

Trident:是IE浏览器的内核

Blink:是webkit的一个分支版本,由google开发

无头浏览器

无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。

PhantomJS

PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

PhantomJS可以说是目前使用最为广泛,也是最被认可的无头浏览器。由于采用的是Webkit内核,因此其和目前的Safari,Chrome等浏览器兼容性十分好。

为什么要使用PhantomJS?

PhantomJS 是一个无界面, 基于Webkit 的javascript 引擎. 一般来说我们的自动化脚本是须要运行在服务器上的, 往往这个时候系统并没有图形界面(如liunx服务器), 或者配置太低跑个浏览器实在是浪费. 而不需要图形界面的 PhantomJS 可谓是我们的不二之选.

PhantomJS安装配置

下载地址:http://phantomjs.org/download.html

下载完成后将phantomjs.exe文件放置Python安装目录即可。

运行使用

driver=webdriver.PhantomJS()

参考文档

http://www.cnblogs.com/diaosicai/p/6370321.html

http://blog.csdn.net/xtuhcy/article/details/52814210?locationNum=5

(0)

相关推荐

  • selenium+python自动化81-报告优化

    一. 优化html报告 为了满足小伙伴的各种变态需求,为了装逼提示逼格,为了让报告更加高大上,测试报告做了以下优化: - 测试报告中文显示,优化一些断言失败正文乱码问题 - 新增错误和失败截图,展示到 ...

  • 软件测试web项目的要点知识

    软件测试web项目的要点知识

  • 如何编写接口测试用例?测试工程师必备技能!

    自动化始终只是辅助测试工作的一个手段,对于测试人员而言,测试基础和测试用例的设计才是核心.如果测试用例的覆盖率或者质量不高,那将这部分用例实现为自动化用例的意义也就不大了. 那么,接口测试用例应该怎么 ...

  • Python Requests Pytest YAML Allure实现接口自动化

    作者:wintest 链接:https://www.cnblogs.com/wintest/p/13423231.html 本项目实现接口自动化的技术选型:Python+Requests+Pytest ...

  • 让你的Chrome提速3倍!亲测有效

    关于 Chrome 浏览器的使用技巧已经安利过很多了,不夸张的话,浏览器是桌面端最高频的应用软件,而同时,Chrome 又是桌面浏览器的扛把子,所以确实有太多实用技巧可以安利. 不过一直以来有个需求似 ...

  • Python单元测试框架-UnitTest以及测试报告

    时间主题9.4(周三)20:00python单元测试框架 在周三的公众号文中,芒果给大家提前剧透了分层自动化测试过程中最重要的一环--单元测试.晚上的测试运维直播课程中,芒果带着大家一起了解了Pyth ...

  • 自动化测试环境的基本组成结构

    理想的自动化测试环境是测试工具可以在任何一个路径位置运行,可以在任何一个路径位置取得测试用例,也可以把测试结果输出到任何一个路径位置上去. 自动化测试环境一般由6个部分组成: 文件服务器 用于存储软件 ...

  • 什么是流程分析法?

    流程分析法是指对业务功能分析的进一步细化,这是从白盒测试中路径覆盖法借鉴过来的一种很重要的方法.在白盒测试中,路径就是指函数代码的某个分支组合,路径覆盖法需要我们构造足够的测试用例以覆盖函数的所有代码 ...

  • 第四章 够级实战技巧(上)

    第四章 够级实战技巧(上) 作者:范光鹏 前言   理解了以上的牌理.经验,还应当掌握一些具体的打牌方法.本人一直强调理解牌理.把握方向是根本,所以本章仍然是从原则和方向上阐述打牌技巧.并不花大力气讲 ...

  • 第四章 够级实战技巧(下)

    第四章 够级实战技巧(下) 作者:范光鹏 前言   理解了以上的牌理.经验,还应当掌握一些具体的打牌方法.本人一直强调理解牌理.把握方向是根本,所以本章仍然是从原则和方向上阐述打牌技巧.并不花大力气讲 ...

  • 股票初级教程 第一章 实战K线 九大核心 1课

    这一栏目为:股票初级教程,共五个章节. 第1章  A股实战K线 1课 (30课时) ----------------------我是分割线---------------------- [马哥闲谈]

  • 《滴天髓》第四章:知命篇(1)何为顺逆之机~实战案例

    《滴天髓》第四章:知命篇(1)何为顺逆之机~实战案例

  • 第五节实战辩证双阴出入(第六章完)

    第五节实战辩证双阴出入(国恒铁路) 双阴出货与双阴入货,是辩证的,一旦处理不好,将会错失良机. 这里有一个真实的.惊险的故事,它发生在2012年5月23日(周三).有位同学按照他学过的阴线战法,于同年 ...

  • Power Query报表自动化实战:将明细内容按区间进行组合

    小勤:像下面这个需求,要将左边的数据源按不同字母涉及的数字进行区间组合,怎么弄比较好? 大海:这个问题如果能确保同一个字母的相关数字是连续的话,解决起来还是比较容易的,但如果同一个字母下的相关数字有可 ...

  • 【128集photoshop系统教程】7章4节-渐变画笔钢笔工具实战案例

    【128集photoshop系统教程】7章4节-渐变画笔钢笔工具实战案例

  • 《Selenium+Pytest Web自动化实战》前100名立减300

    课程介绍 课程主题:<Selenium+Pytest Web自动化实战> 适合人群: 1.功能测试转型自动化测试 2.web自动化零基础的小白 3.对python 和 selenium 有 ...

  • 知乎赚钱实战:我是如何一篇文章赚 3000+

    声明:本文来自于微信公众号 痴海(ID:growth_ch),作者:  阿昕,授权站长之家转载发布. 每周,痴海会教你一个爬虫实战应用. 通过项目思路讲解,让你知道原来爬虫还可以这样逆天操作! 今天的 ...