• Jenkins自动构建-部署-测试


    大概的思路:

    1.Jenkins拉取git代码,自动构建

    2.构建成功后,将程序/jar包上传到测试服务器,并在测试服务器执行部署脚本

    3.以上完成后,触发自动化测试,由jenkins中的另一个任务触发

    4.例如在一台jenkins 的slave上(windows)触发执行自动化测试脚本,测试完成后,将报告发送到Jenkins中设置的人员以及在jenkins中展示

    一。jenkins中的设置

    邮件通知的设置

    注:这里的Password不是邮箱的密码,而是邮箱的授权码,可以百度下怎么获取

    测试服务器的设置

    设置完毕后,可以点击test configuration进行测试,查看是否能连得到

     主工程的设置(需要构建的项目)

    参数化构建,通过提交的分支或者tag进行部署,当然也可以选择revision

    源码的配置

    构建脚本

    rm -rf ./dist
    rm -rf ./dist.zip
    npm install
    npm run build
    cd $WORKSPACE/
    echo "GIT_COMMIT: " > dist/git.txt
    echo $GIT_COMMIT >> dist/git.txt
    echo -e "
    GIT_URL: " >> dist/git.txt
    echo ${GIT_URL#*xxxxxx.com.cn} >> dist/git.txt
    
    zip -r dist.zip dist

    前端项目,通过npm进行打包,另外需要将当前的版本号打包进去

    构建完成后需要执行的内容

    归档成品,也可以不需要

    执行的另一个project,也就是执行自动化测试的project

     通过publish over  ssh将dist.zip传到我们的测试服务器并执行部署脚本,需要注意执行的脚本的权限问题

    自动化测试工程的设置

     

    指定在哪一台slave执行,windows是我创建的一台windows测试机

    源码我没有设置,因为只是临时搭建下,我直接把测试代码放在了测试机上,实际上,应该通过svn或者其他方式拉取到测试机上,每次执行自动化测试的时候拉取最新的测试代码

     执行自动化测试脚本

    jenkins中的报告展示,设置报告的路径

     设置邮件通知

    独立设置的收件人邮箱

    邮件的正文以及将日志和测试报告作为附件 

    二。测试代码

    和之前的思路也差不多,unittest、htmltestrunner这些

    新加的东西:将每个页面的元素都配置在一个py中,引入虫师的poium

    如果能通过name或者id定位到元素最好,xpath不是很稳定(前端布局修改时,xpath可能会造成变更)

    #coding:utf-8
    from poium import Page,PageElement,PageWait
    class loginPage(Page):
        userNameInput = PageElement(xpath = '//*[@id="app"]/div/div/form/div[1]/div/div[1]/input',timeout=5,describe='登录用户名输入框')
        passwordInput = PageElement(xpath = '//*[@id="app"]/div/div/form/div[2]/div/div[1]/input',timeout=5,describe='用户密码输入框')
        loginButton = PageElement(xpath = '//*[@id="app"]/div/div/form/div[3]/div/button',describe='登录按钮')
        showPWDButton = PageElement(xpath = '//*[@id="app"]/div/div/form/div[2]/div/span',describe='明密文切换按钮')

    判断case是否通过的方式,从检查特定元素是否存在改为,预设正常情况下的屏幕截图,和实际执行操作时的屏幕截图进行对比,通过相似度进行判断,相似度的设置需要自己斟酌下

    #coding:utf-8
    import os
    from PIL import Image
    import math
    import operator
    from functools import reduce
    
    def takeDiff(pic1,pic2):
        image1 = Image.open(pic1)
        image2 = Image.open(pic2)
        histogram1 = image1.histogram()
        histogram2 = image2.histogram()
        differ = math.sqrt(reduce(operator.add, list(map(lambda a, b: (a - b) ** 2, histogram1, histogram2))) / len(histogram1))
        if differ <19:
            return True
        else:
            return False

    将一个模块的用例放在一个py文件中(只是我的做法是这样)

    #coding:utf-8
    import unittest
    from selenium import webdriver
    from HTMLTestRunner_cn import HTMLTestRunner
    import time
    from common import common,base_page
    import os
    #截图存放位置
    spath = r'C:/python/BI_auto/screenshot/login'
    class LoginTest(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Chrome()
            self.loginPage = base_page.loginPage(self.driver)
            self.homePage = base_page.homePage(self.driver)
            self.loginPage.get('xxxxxxx.com.cn/#/login')
            self.driver.maximize_window()
    
        def tearDown(self):
            self.driver.close()
    
        def add_img(self):
            self.imgs.append(self.driver.get_screenshot_as_base64())
            return True
    
        def cleanup(self):
            pass
    
        def test_login_03(self):
            u'''检查显示密码按钮'''
            try:
                self.loginPage.passwordInput = 'admin'
                self.loginPage.showPWDButton.click()
                time.sleep(3)
                self.driver.get_screenshot_as_file(spath + '点击显示密码按钮.png')
                #截图对比结果,如果差异值小于9则认为相同(admin密码明密文显示差异值在10)
                diffResult = common.takeDiff(spath + '点击显示密码按钮.png',r'C:/python/BI_auto/testPic/login_03.png')
                #删除用作对比时的截图
                os.remove(spath + '点击显示密码按钮.png')
                #self.assertEqual(diffResult,1,'点击显示密码按钮,密码没有变为明文')
                self.assertTrue(diffResult,'点击显示密码按钮,密码没有变为明文')
            except:
                #self.driver.get_screenshot_as_file(spath+'03_点击显示密码,密码没有变为明文.png')
                self.add_img()
                raise

    我设置的路径都是绝对路径,应该用相对路径

    对元素的操作完毕后,截图,和预设的图片进行对比,对比完成后将截图删除,再对比较结果进行判断

    如果相似度过低,则将现在的屏幕截图保存到报告中

    用例的执行统一放到all_test中

    #coding=utf-8
    import unittest
    import sys
    import os
    sys.path.append("/test_case")
    #添加test_case目录
    from testcase import login,importDB
    #import HTMLTestRunner
    from HTMLTestRunner_cn import HTMLTestRunner
    import time
    
    alltestnames = [login.LoginTest]
    # alltestnames = [login.LoginTest,
    #                 importDB.ImportDBTest
    #                 ]
    
    testunit = unittest.TestSuite()
    
    for test in  alltestnames:
        testunit.addTest(unittest.makeSuite(test))
    
    timestr = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
    #filename = r'C:/python/BI_auto/report/'+timestr+ r'.html'
    filename = r'C:/workspace/bi_UI_auto/report/'+ r'newest.html'
    fp = open(filename,'wb')
    runner = HTMLTestRunner(
        stream=fp,
        title='BI测试报告',
        description='report',
        verbosity=2
    )
    runner.run(testunit)
    fp.close()
    print('执行完毕,报告路径:'+filename)

    一样,路径的问题需要自己再调整下,jenkins中自动化测试的project中需要做的也就是获取最新的测试代码(需要修改代码中的路径设置)然后执行这个all_test.py

    三。执行结果

    构建、部署、测试完毕后,会有邮件发送

    在jenkins中也能看到本次的报告

    执行失败的用例,点击显示截图能看到测试时的截图

  • 相关阅读:
    linux cd命令的重要用法:cd -,cd ~
    linux ls命令的重要用法:按照文件大小排序和按照时间排序
    Linux中默认的shell如何切换为其他类型的shell
    centos 7网卡配置文件详解(ifcfg-ens33)
    linux分区规划
    final关键字
    分布式事务
    读写分离-读仍走主库的问题
    Dockerfile指令
    Docker命令总结【第一本docker书】
  • 原文地址:https://www.cnblogs.com/delete31/p/13534975.html
Copyright © 2020-2023  润新知