puptter自动化测试初探

Posted StrongerIrene

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了puptter自动化测试初探相关的知识,希望对你有一定的参考价值。

1. vitest怎么样

vite的官方测试工具, 好像是单元测试来着,Jtest也是单元测试

Vitest | A blazing fast unit test framework powered by Vite

但是更好的是e2e,也就是模拟用户操作

一个很不错的vites网址 入门:使用 Vitest 测试 React 组件 - 掘金

2. 测试有几种

UI 测试(UI Test)只是对于前端的测试,是脱离真实后端环境的,仅仅只是将前端放在真实环境中运行,而后端和数据都应该使用 Mock 的。

端到端测试(E2E Test)则是将整个应用放到真实的环境中运行,包括数据在内也是需要使用真实的。

• 单元测试(Unit Test)有 Mocha, Ava, Karma, Jest, Jasmine 等。 • 集成测试(Integration Test)和 UI 测试(UI Test)有 ReactTestUtils, Test Render, Enzyme, React-Testing-Library, Vue-Test-Utils 等。

test是利用断言的规则,如

import sum from './sum';

test('adds 1 + 2 to equal 3', () => 
  expect(sum(1, 2)).toBe(3);
);

还是老生常淡啊。目前绝大部分实际业务项目里,前端的单元测试都没啥鸟用,UI自动测试又太难搞。

主要还是要看业务场景,这个确实是很值得思考的东西,需要去积累经验。

确实,辛辛苦苦写的UI测试,页面一改版,全都要重写测试用例,太累了

积累就是 你写了一堆测试用例 最后需求说 这个需要不需要了

3. puppter安装

我们使用pnpm进行安装,节省磁盘空间(用的是软连接)

npm install -g pnpm

但是,即使是cnpm,也下不了puppter,node-sass也是,因为

在它们的包里,就存在指向外部的链接,所以要么

添加 --ignore-scripts 直接无视额外安装脚本,这样你启动的时候还是会报没有chrome,然后手动下载一个可以。

例如:npm i --save-dev node-sass --ignore-scripts

要么

使用对应的镜像源参数,
例如:npm i --save-dev node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

4. puppter相关

 puppterr 是谷歌官方推出的,可以配合recorder来做,直接生成代码,见chrome浏览器也能做自动化测试_chrome自动化_九柄说测试的博客-CSDN博客

这个链接,带代码的,可以运行起来,可以试试Node + ts + puppeteer e2e前端自动化测试 - 掘金

https://github.com/XieTongXue/happy-front-end/tree/master/e2e-test

还是那个人写的试试前端自动化测试!(基础篇) - 掘金  介绍测试也不错

这2也ok Puppeteer + Puppeteer Recorder WEB自动化测试 - 掘金

Puppeteer前端自动化测试实践 - 掘金 

Python3+unitest自动化测试初探(中篇)


本篇随笔承接:Python3+unitest自动化测试初探(上篇)

地址:Python3+unitest自动化测试初探(上篇)

6、生成测试报告

6.1、下载HTMLTestRunner.py

原版下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 。原版的只支持Python 2.x版本,Python 3.x版本需要做适配。
适配后的下载地址:https://github.com/Slience007/pyunitest/blob/master/untils/HTMLTestRunner.py

6.2、安装HTMLTestRunner.py

安装方法比较简单,将HTMLTestRunner.py放到sys.path路径下即可。ubuntu下,我放到了如下路径:/usr/lib/python3.7。

6.3、生成报告

HTMLTestRunner.py提供HTMLTestRunner()类来代替unittest.TextTestRunner()执行用例,修改后的run.py的代码如下:

#coding:utf-8
import  unittest
#导入HTMLTestRunner
from HTMLTestRunner import  HTMLTestRunner
#从testCase包里面导入测试类
from testCases.userLoginTest import loginTest
from testCases.userRegTest import regTest

#构造测试套
def suite():
    suite = unittest.TestSuite()
    suite.addTest(loginTest("test_loginsucess_L0"))
    suite.addTest(loginTest("test_pwdwrong_L0"))
    suite.addTest(loginTest("test_statuserr_L1"))
    suite.addTest(regTest("test_pwdlenerr_L1"))
    suite.addTest(regTest("test_regsucess_L0"))
    suite.addTest(regTest("test_regagain_L1"))
    return suite

#运行测试用例
if __name__ == \'__main__\':
    # runner = unittest.TextTestRunner()
    # #调用test runner的run方法执行用例
    # runner.run(suite())
    #以二进制格式打开TestReport.html用于写入数据
    with open("./TestReport.html","wb") as f:
        runner = HTMLTestRunner(stream=f,title="Reg And Login Test Report")
        runner.run(suite())

运行run.py后,打开TestReport.html,查看生成的测试报告。

7、编写邮件发送工具

在Project下新建包utils用来封装一些常用的工具,在utils下新建Python文件emailUtil.py。定义sendEmail类。这个类主要包含3个方法:

  1. init():初始化
  2. writeEmail():构造邮件主题,邮件正文,添加邮件附件。
  3. sendEmail():连接邮件服务器,认证,发送邮件。我采用的是网易邮件服务器,其地址是smtp.126.com。收件地址为QQ邮箱。

[ 代码如下:]emailUtil.py

#coding:utf-8
\'\'\'
email模块负责构造邮件内容
smtplib模块负责发送邮件
\'\'\'
from email.mime.text import  MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email.header import Header

class sendEmail():
    #定义全局变量邮件服务器地址,登录用户,授权码
    global MAILHOST,MAILUSER,MAILPWD
    MAILHOST = "smtp.126.com"
    MAILUSER = "××××@126.com"
    MAILPWD = "×××"

    def __init__(self,subject,content,reveiver,attachPath=""):
        self.subject = subject
        self.content = content
        self.receiver = reveiver
        self.attachPath = attachPath
    #写邮件,返回msg.as_string()
    def writeEmail(self):
        msg = MIMEMultipart()
        #邮件正文
        msg.attach(MIMEText(self.content, \'plain\', \'utf8\'))
        receiverName = ",".join(self.receiver)
        msg[\'from\'] = Header(MAILUSER,\'utf-8\')
        #msg[\'to\'] =  Header(",".join(self.receiver)).encode()
        msg[\'to\'] = Header(receiverName).encode()
        #邮件主题
        msg[\'Subject\'] = Header(self.subject,\'utf-8\').encode()
        #print("msg is:",msg)
        #attachPath不为空则添加附件到邮件中
        if self.attachPath != "":
            with open(self.attachPath, \'rb\') as f:
                attach1  = MIMEText(f.read(), \'base64\', \'utf-8\')
                attach1["Content-Type"] = \'application/octet-stream\'
                #filename可以随便写
                attach1["Content-Disposition"] = \'attachment; filename="Result.html"\'
                msg.attach(attach1)

        return msg.as_string()

    #发送邮件
    def sendEmail(self):
        receiver = ";".join(self.receiver)
        try:
            #连接邮件服务器
            server = smtplib.SMTP()
            server.connect(MAILHOST,25)
            #打开debug模式可以看到握手过程
            #server.set_debuglevel(1)
            #登录,MAILPWD为网易邮件的授权码
            server.login(MAILUSER,MAILPWD)
            #发送邮件
            server.sendmail(MAILUSER,receiver,self.writeEmail())
            server.quit()
            print("Email send sucess.")
        except Exception as  e:
            print("Email send fail.")
            print(e)

在编写邮件工具的时候,碰到了一个错误:smtplib.SMTPDataError: (554, b\'DT:SPM。原因可能是:邮件被网易邮件服务器当成了垃圾邮件。解决办法:邮件主题不能包含test,另外msg[from"],msg[\'to\']要和server.sendmail(MAILUSER,receiver,self.writeEmail())中的MAILUSER和receiver保持一致。

8、发送邮件

在发送邮件之前,先获取本次执行用例总数,失败用例数,成功用例数,跳过的用例数。并计算出用例通过率。

  1. suite().countTestCases():获取用例总数。
  2. runner.run(suite()).success_count:运行通过的用例数。
  3. runner.run(suite()).failure_count:失败的用例数。
  4. runner.run(suite()).skipped:返回的是跳过的用例list。

接下来来修改run.py ,需要先从utils模块导入sendEmail类,构造主题,邮件正文,指定收件人列表,指定测试报告的路径,之后调用sendEmail方法发送邮件。修改后的run.py代码如下:

#coding:utf-8
import  unittest
#导入HTMLTestRunner
from HTMLTestRunner import  HTMLTestRunner
#从testCase包里面导入测试类
from testCases.userLoginTest import loginTest
from testCases.userRegTest import regTest

from utils.emailUtil import sendEmail
#构造测试套
def suite():
    suite = unittest.TestSuite()
    suite.addTest(loginTest("test_loginsucess_L0"))
    suite.addTest(loginTest("test_pwdwrong_L0"))
    suite.addTest(loginTest("test_statuserr_L1"))
    suite.addTest(regTest("test_pwdlenerr_L1"))
    suite.addTest(regTest("test_regsucess_L0"))
    suite.addTest(regTest("test_regagain_L1"))
    return suite

#运行测试用例
if __name__ == \'__main__\':
    # runner = unittest.TextTestRunner()
    # #调用test runner的run方法执行用例
    # runner.run(suite())
    #以二进制格式打开TestReport.html用于写入数据
    with open("./TestReport.html","wb") as f:
        runner = HTMLTestRunner(stream=f,title="Reg And Login Test Report")
        result = runner.run(suite())
        totalNums = suite().countTestCases()
        passedNums = result.success_count
        failedNums = result.failure_count
        skippedNums = len(result.skipped)
        #通过率,保留两位小数
        passRate = round(passedNums * 100/  totalNums)
        emailBody = "Hi,all:\\n \\t本次构建一共运行:{totalNums}个用例,通过{passedNums}个,失败{failedNums}个,跳过{skippedNums}个。通过率:{passRate}%.\\n \\t详细信息请查看附件。"
        content = emailBody.format(totalNums=totalNums,passedNums=passedNums,failedNums=failedNums,skippedNums=skippedNums,passRate=passRate)
        #收件人列表
        receiver = [\'××××@qq.com\',"×××××@126.com"]
        #测试报告的路径
        path1 = "/home/stephen/PycharmProjects/unitTestDemo/TestReport.html"
        subject = "登录注册功能每日构建"
        e = sendEmail(subject,content,receiver,attachPath=path1)
        #发送邮件
        e.sendEmail()

运行run.py。登录邮箱查看已经发送成功的邮件。

点击这里返回本篇目录

以上是关于puptter自动化测试初探的主要内容,如果未能解决你的问题,请参考以下文章

junit初探

JUnit单元测试

Java应用XVIII在 Java 中使用JUnit5进行单元测试和自动化测试

Junit单元测试

Junit单元测试自动注入失败

junit搭建自动化测试框架