关于测试环境搭建:在macOS-Big-Sur-上搭建移动端UI测试环境

装置JDK 8https://www.java.com/zh-CN/do... 上下载Java 8点击装置在.zshrc 中设置环境变量在终端输出source .zshrc 让配置失效export JAVA_8_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"export JAVA_HOME=$JAVA_8_HOMEexport PATH="$PATH:$JAVA_HOME"export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar装置Android_SDK新建 Android 文件夹$ mkdir ~/Library/Android在 .zshrc 中设置环境变量export ANDROID_HOME=/Users/xxx/Library/Android/export PATH=${PATH}:${ANDROID_HOME}/toolsexport PATH=${PATH}:${ANDROID_HOME}/platform-toolsexport PATH=${PATH}:${ANDROID_HOME}/tools/binexport PATH=${PATH}:${ANDROID_HOME}/emulatorexport ANDROID_SDK=${ANDROID_HOME}export ANDROID_NDK=${ANDROID_HOME}/ndk-bundle在终端输出source .zshrc 让配置失效$ source .zshrc下载 android-sdk$ brew install android-sdk查问sdk有哪些包反对$ sdkmanager --list安装包$ sdkmanager "build-tools;31.0.0"$ sdkmanager "platform-tools"装置网易MUMU模拟器https://mumu.163.com/mac/inde... 下载最新模拟器连贯模拟器的两种形式adb connect 127.0.0.1:5555adb kill-server && adb server && adb shell

November 14, 2021 · 1 min · jiezi

关于测试环境搭建:一站式的开源持续测试平台MeterSphere

【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107827383 在咱们理论的我的项目迭代过程中,基本上会经验过的几个问题: 测试用例不标准,有些甚至没有测试用例文档文档随集体爱好轻易应用,word、excel、xmind...没有专门的人去治理这些文档,工夫长了就失落了测试用例和测试脚本很凌乱,根本都是测试集体保存以前的公司,包含当初的公司都自研过本人的测试平台,然而都不尽人意,直到看到MeterSphere让人眼前一亮,产品的厂家和JumpServer的厂家是同一个,比拟靠谱,从公布到当初差不多7个月的工夫,star曾经超过了1.4k,十分沉闷。 为什么要继续测试?传统 QA 团队和实际难以满足数字业务的需要 数字业务的要求缩短交付工夫快节奏交付从品质保障到品质帮助传统 QA 的不足之处人工测试耗时长“部门墙”和“交接”依然存在Bug 发现和解决老本高什么是 MeterSphere ?MeterSphere 是一站式的开源企业级继续测试平台,涵盖测试跟踪、接口测试、性能测试、团队合作等性能,兼容JMeter 等开源规范,无效助力开发和测试团队充分利用云弹性进行高度可扩大的自动化测试,减速高质量软件的交付。 整体定位继续测试是企业 DevOps 实际中的关键环节 测试跟踪 测试用例治理树状用例治理构造在线编辑用例疾速导入用例测试计划跟踪基于已有用例发动测试在线更新用例执行后果自定义测试报告模板接口测试 测试脚本在线编辑测试内容反对参数化测试反对断言、变量提取通过浏览器插件疾速录制测试报告主动生成测试报告屡次测试后果比照查看申请及响应详情测试报告内容导出性能测试 测试脚本齐全兼容 JMeter 脚本在线调整压力参数分布式、多平台测试资源池通过浏览器插件疾速录制测试报告主动生成测试报告屡次测试后果比照丰盛的报告展现详情测试报告内容导出团队合作 多租户反对多级租户体系反对多种租户角色租户资源隔离测试资源管理性能测试资源池测试报告模板第三方零碎对接MeterSphere 的劣势全生命周期 可能笼罩从测试计划到测试执行、测试报告剖析的不同阶段自动化 & 扩展性 反对接口和性能的自动化测试,可充分利用云弹性实现超大规模的性能测试继续测试 可能与继续集成工具无缝集成,撑持企业实现测试左移团队合作 反对不同规模的测试团队,小到几个人的测试团队,大到数百人的测试中心技术栈后端: Spring Boot前端: Vue.js中间件: MySQL, Kafka基础设施: Docker, Kubernetes测试引擎: JMeter整体架构 Frontend: MeterSphere 的前端工程, 基于 vue.js 进行开发Backend: MeterSphere 的后端后称, 基于 Sprint boot 进行开发, 为 MeterSphere 的性能主体Chrome plugin: 浏览器插件, 录制 web 拜访申请生成 JMeter 脚本并导入到 MeterSphere 中用于接口测试及性能测试Node controller: 为性能测试提供独立节点类型的测试资源池, 接管来自零碎的性能测试工作, 动静的启动 JMeter 容器实现性能测试MySQL: MeterSphere 我的项目的次要数据均存储在 MySQLKafka: 接管 JMeter 产生的性能测试后果数据Data streaming: 从 Kafka 中获取性能测试后果数据进行解决后存入 MySQL 数据库Docker engine: 为 Node Controller 提供 JMeter 容器运行环境各个组件间的关系可参考下图 ...

August 5, 2020 · 1 min · jiezi

DOS-Network-六月项目月报

各位亲爱的 DOS 社区的支持者们,欢迎阅读 6 月 1 日至 6 月 30 日的月度项目进度报告!???? ⚙ 产品和开发从 #beta1.1 测试网从 6 月启动以来,我们持续对节点软件进行优化、同时开发网络浏览器和用户仪表盘。 具有一定技术背景或者对命令行操作界面不陌生的节点运行者可以填写申请表并遵从 GitHub 文档来启动一个测试网节点。 测试节点申请表:https://docs.google.com/forms/d/e/1FAIpQLSdiWuVdyxpVozEC0uWZIj9HCBX9COBYFj8Dxp2C2qX4Qv5U9g/viewform  GitHub 节点文档:https://github.com/DOSNetwork/core/blob/master/README.md 节点 / 客户端软件开发:开启 geth 的轻客户端 (light-client) 模式,减小节点运行者长期维护以太坊全节点的压力。修复了节点订阅合约事件时 Web Socket 断线重连和 eth_proxy 的 EOF 错误。重新定义客户端子命令让节点新生成本地的节点钱包。节点地址与持币地址分开,从此质押的代币不再需要转移到节点地址,而是统一锁定在质押合约中 - 这减少了资金暴露在“热”钱包里的风险。修复启动过程和 DKG (分布式密钥生成) 过程 CPU 使用率过高的问题。改进代码格式、注释、更多的测试覆盖和修复其他一些小问题。智能合约开发:系统合约 : 增加了节点注销函数。给 proxy 合约增加了 truffle 单元测试。- 质押 / 委托合约: 正在开发质押和委托合约。质押 / 委托合约允许节点运行者以及普通持币用户得到质押挖矿的收益。持币用户可以不跑节点、而是把代币委托给节点并且赚取一部分利息;节点运行者除了得到自己质押代币的全部利息之外,也能得到用户委托给该节点的代币产生的利息的一部分。开发者和节点运行者的文档:更新开发者文档 到最新的预言机使用样例和最新版部署的 #beta1.1 合约。http://developers.dos.network更新从源代码编译及运行 beta 测试网节点的 GitHub 文档 (文档在持续更新中)。网络浏览器、用户界面:我们正在开发网络浏览器,方便持币用户及节点运行者搜索节点状态和网络中发生的事件。在这里预览现在的前端设计原型图:https://scene.zeplin.io/project/5d0250d2f695e65dec3f8053 其他:在币安链上发行了 BEP2 DOS 代币,并且从所有 validators 那得到了登陆币安去中心化交易所 DEX 的支持。DOS/BNB 交易对将于 7 月 8 日下午 6 点在币安 DEX 开启交易,同时我们会在下周发布一系列活动,敬请期待!为了方便用户进行代币转换,我们开发了从 ERC20 DOS 到 BEP2 DOS 转换桥https://swap.dos.network。后续我们会持续开发转换桥来实现自动的双向代币转换。转换代币的教程请查看这里「DOS 即将登陆 Binance DEX,并提供 ERC20 DOS 到 BEP2 DOS 的转换中继」???? 运营和市场6 月 2 日,DOS Network 运营和业务发展负责人孙孝虎受邀参加了 BitMax在北京举办的线下粉丝见面会。孙孝虎在会议上发表了演讲,介绍了预言机在区块链行业的重要性,必要性以及预言机的应用场景等。 ...

July 5, 2019 · 1 min · jiezi

在 Angular 中引入 Jest 进行单元测试

在 Angular 中引入 Jest 进行单元测试为什么要从 Karma 迁移到 Jest用 Karma 在项目中遇到了坑最近新换了一个项目,去的时候项目已经做了两个月了,因为前期赶功能,没有对单元测试做要求,CI/CD 的时候也没有强制跑单元测试。所以虽然有用 Angular CLI 自动生成的测试文件,但是基本上都是测试不通过。项目做久了,人员变动多,新来的成员对之前的业务逻辑不清不楚,稍不注意就会破坏之前的功能;业务复杂了,随便增加或者修改一点点功能都可能引起不易被察觉的 BUG。作为一个敬业的开发,不上单元测试怎么行。所以,就有了一个修复已有单元测试的任务。修复已有测试文件的思路很简单:写个 TestingModule 把常用的依赖 mock 掉,再引入到需要的文件中就行了;不常用的依赖,在各自的文件中 mock 掉就好了。然而实际操作起来的时候,Karma 早早挖好坑等这了。有些测试文件单跑没有问题,整体跑得时候就报错,测试结果及其不稳定;karma 的报错信息又特别难读懂,很多时候根本定位不到到底是哪里出了问题。再加上 Karma 需要先把 Angular 应用编译之后再在浏览器中跑测试,整体时间也比较慢,修复的过程一直处于抓狂的边缘。整体测试跑起来的时候难以定位测试出错的定位,怎么办呢,那就让跑整个测试的时候各个文件之间也没有依赖可以单独跑好了,所以就想到了 Jest。实践证明,在 Angular 中, Jest 大法也非常好使。Karma 和 Jest 的对比前面也说过了,在修复测试的过程中,karma 遇到了各种各样的问题。归结起来大概就是:Karma 需要先把 Angular 应用整体编译之后再在浏览器中跑测试,跑测试的时间比较长;Karma 测试结果不稳定(很可能是因为异步操作引起的),单个文件和整体测试时的测试结果不一致;报错信息模糊不清,无法定位问题。特别是在有大量测试需要修复的情况下,难以定位问题的根本原因。那么对比而言,Jest 在上面这些方面都有很好的表现:不需要整体编译,可以单文件测试测试结果稳定报错清楚,易于定位问题除了这些,Jest 还有的好处有:开箱即用,基本算是全家桶,包含了测试需要的大部分工具:测试结构、断言、spies、mocks直接提供了测试覆盖率报告快照测试非常强大的模块级 mock 功能watch 模式仅仅测试和被修改文件相关的测试,速度非常快迁移第一步,你需要相关依赖包:npm install –save-dev jest jest-preset-angular @types/jest其中:jest – Jest 测试框架jest-preset-angular – jest 对于 angular 的一些通用的预设置@types/jest – Jest 的 typings第二步,你需要在 package.json 中对 Jest 进行配置:“jest”: { “preset”: “jest-preset-angular”, “setupFilesAfterEnv”: ["<rootDir>/src/setupJest.ts"]}其中,preset 声明了预设,setupFilesAfterEnv 配置了 Jest setup 文件的地址,可以包含多个文件,这里设置的是项目根目录下的 src/setupJest.ts。第三步,在 src 目录下创建上一步中设置的 setup 文件 setupJest.tsimport ‘jest-preset-angular’; // jest 对于 angular 的预配置import ‘./jestGlobalMocks’; // jest 全局的 mock第四步,在 src 目录下创建 jestGlobalMocks.ts 文件,并加入相关的全局的 mock,以下是一个例子:const mock = () => { let storage = {}; return { getItem: key => key in storage ? storage[key] : null, setItem: (key, value) => storage[key] = value || ‘’, removeItem: key => delete storage[key], clear: () => storage = {}, };};Object.defineProperty(window, ’localStorage’, {value: mock()});Object.defineProperty(window, ‘sessionStorage’, {value: mock()});Object.defineProperty(window, ‘getComputedStyle’, { value: () => [’-webkit-appearance’]});可以看到这个例子中 mock 了 window 上的对象,这是因为 jsdom 并没有实现所有的 window 上的对象和方法,所以有时我们需要自己给 window 打个补丁。在这里 mock localStorage 是可选的,如果我们在代码中并没有使用。但是 mock getComputedStyle 是必须的,因为 Angular 会检查它在哪个浏览器中执行。如果没有 mock getComputedStyle,我们的测试代码将无法执行。接下来,我们就可以在 package.json 的 script 中配置 test 的命令了:“test”: “jest”,“test:watch”: “jest –watch”,其中 test 只跑一次测试,test:watch 可以检测文件变化,跑当前有修改的文件的相关测试。此时,在命令行中运行测试命令,就应该能够顺利把测试跑起来并通过了。如果没有通过,可能是因为我们在 src/tsconfig.spec.json 中的 file 配置中有 test.js 的配置,这是 Karma 的 setup 文件,删掉这行配置并删除对应的文件,(src/tsconfig.app.json 中出现的 test.js 也可一并删除),重新跑一遍测试命令:npm run test至此,Jest 测试环境就算顺利搭建好了。如果你对代码有洁癖,接下来,你还可以删除 Karma 的相关代码,将测试全部转为 Jest。删除 Karma 相关代码删除相关依赖包(@types/jasmine @types/jasminewd2 jasmine-core jasmine-spec-reporter 因为在 e2e 测试中有使用所以不能删除):npm uninstall karma karma-chrome-launcher karma-coverage-istanbul-reporter karma-jasmine karma-jasmine-html-reporter删除文件 src/karma.config.js删除 angular.json 中 test 的配置src/tsconfig.spec.json 中 compilerOptions.type 的配置移除 jasmine, 加上 jest。至此,你已经删除了所有与 Karma 相关的代码。你甚至还能将测试断言换成 jest 的风格。查看最后生成的代码库和相关文件配置参考:Angular 6: “ng test” with Jest in 3 minutesTESTING ANGULAR FASTER WITH JEST ...

March 30, 2019 · 2 min · jiezi

Jenkins+git+maven自动打包

linux环境配置1 安装Javayum install java-1.8.0-openjdk.x86_642 安装mavenyum install maven3 安装gityum install git4 安装tomcat下载最新的tomcat包,放到/root目录下,运行tar zxvf tomcat-*.tgz5 安装运行Jenkins点击这里下载Jenkins最新的war包,并放到/root/apache-tomcat-7.0.86/webapps/目录下。6 运行命令 cd apache-tomcat-7.0.86/webapps/ 进入war包所在目录,运行命令nohup java -jar jenkins.war –httpPort=8080 & 启动Jenkins。8080为默认端口,如果和其他服务冲突可改变为其他端口7 浏览器访问 服务器地址:端口号(例如192.168.0.100:8080)即可访问JenkinsJenkins配置1 安装必需的插件Deploy to container Plugin; GitLab Plugin;Maven Integration2 配置jenkins工具环境配置jdk配置Git配置Maven3 新建任务,选择构建maven项目4 source Code Management选择Git需要先点击add添加一个账号,打开这个页面填写你在gitlab的账号密码即可选择刚添加的账号,下面的分支记得改成自己需要的5 勾选一下构建快照6 Build这个pom文件不用修改,下面的语句可添加也可不添加7 配置到这一步已经可以自动打包了,我们构建看一下第一次运行会下载很多jar包,等待下载完成即可,打包成功后如下图所示报错1 [ERROR] Failed to execute goal on project : Could not resolve dependencies for project 🫙1.0-SNAPSHOT: The following artifacts could not be resolved: com.alibaba:dubbo🫙2.8.4, com.cloopen:sms-rest-sdk🫙2.6.3, com.taobao.pamirs.schedule:tbschedule🫙3.3.3.2: Could not find artifact com.alibaba:dubbo🫙2.8.4 in central (http://jcenter.bintray.com)缺少对应的jar包,可以直接从其他测试环境下复制过来 ...

March 27, 2019 · 1 min · jiezi

Puppeteer前端自动化测试实践

本篇内容将记录并介绍使用Puppeteer进行自动化网页测试,并依靠约定来避免反复修改测试用例的方案。主要解决页面众多时,修改代码导致的牵连错误无法被发现的运行时问题。文章首发于个人博客起因目前我们在持续开发着一个几十个页面,十万+行代码的项目,随着产品的更迭,总会出现这样的问题。在对某些业务逻辑或者功能进行添加或者修改的时候(尤其是通用逻辑),这些通用的逻辑或者组件往往会牵扯到一些其他地方的问题。由于测试人员受限,我们很难在完成一个模块单元后,对所有功能重新测试一遍。同时,由于环境及数据的区别,(以及在开发过程中对代码完备性的疏忽),代码会在某些特殊数据的解析和和展示上出现问题,在开发和测试中很难去发现。总的来说,我们希望有一个这样的工具,帮我们解决上述几个问题:在进行代码和功能改动后,能够自动访问各个功能的页面,检测问题针对大量的数据内容,进行批量访问,检测对于不同数据的展示是否存在问题测试与代码功能尽量不耦合,避免每次上新功能都需要对测试用例进行修改,维护成本太大定期的测试任务,及时发现数据平台针对新数据的展示完备性其中,最重要的问题,就是将测试代码与功能解耦,避免每次迭代和修改都需要追加新的测试用例。我们如何做到这一点呢?首先我们来梳理下测试平台的功能。功能设定由于我们的平台主要是进行数据展示,所以我们在测试过程中,主要以日常的展示数据为重心即可,针对一些复杂的表单操作先不予处理。针对上述的几个问题,我们针对自动化测试工具的功能如下:依次访问各个页面访问各个页面的具体内容,如时间切换、选项卡切换、分页切换、表格展开行等等针对数据表格中的详情链接,选择前100条进行访问,并进行下钻页的继续测试捕获在页面中的错误请求对错误信息进行捕获,统计和上报根据以上的梳理,我们可以把整个应用分为几个测试单元页面单元,检测各功能页面访问的稳定性详情页单元,根据页面的数据列表,进行批量的详情页跳转,检测不同参数下详情页的稳定性功能单元,用于检测页面和详情页各种展示类型点击切换后是否产生错误通过这样的划分,我们针对各个单元进行具体的测试逻辑书写用例,这样就可以避免再添加新功能和页面时,频繁对测试用例进行修改了。Puppeteer带着上面我们的需求,我们来看下Puppeteer的功能和特性,是否能够满足我们的要求。文档地址Puppeteer是一个Node库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行,但是可以通过修改配置文件运行“有头”模式。我们可以使用Puppeteer完成以下工作:访问页面,进行截图自动进行键盘输入,提交表单模拟点击等用户操作等等等等。。我们来通过一些小案例,来介绍他们的基本功能:访问一个带有ba认证的网站puppeteer可以创建page实例,并使用goto方法进行页面访问,page包含一系列方法,可以对页面进行各种操作。(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); // ba认证 await page.authenticate({ username, password }); // 访问页面 await page.goto(‘https://example.com’); // 进行截图 await page.screenshot({path: ’example.png’}); await browser.close();})();访问登陆页面,并进行登录首先,对于SPA(单页面应用),我们都知道,当页面进入后,客户端代码才开始进行渲染工作。我们需要等到页面内容渲染完成后,再进行对应的操作。我们有以下几种方法来使用waitUntilpuppeteer针对页面的访问,切换等,提供了waitUntil参数,来确定满足什么条件才认为页面跳转完成。包括以下事件:load - 页面的load事件触发时domcontentloaded - 页面的DOMContentLoaded事件触发时networkidle0 - 不再有网络连接时触发(至少500毫秒后)networkidle2 - 只有2个网络连接时触发(至少500毫秒后)通过waitUnitl,我们可以当页面请求都完成之后,确定页面已经访问完成。waitForwaitFor方法可以在指定动作完成后才进行resolve// wait for selectorawait page.waitFor(’.foo’);// wait for 1 secondawait page.waitFor(1000);// wait for predicateawait page.waitFor(() => !!document.querySelector(’.foo’));我们可以利用waitForSelector方法,当登录框渲染成功后,才进行登录操作// 等待密码输入框渲染await page.waitFor(’#password’);// 输入用户名await page.type(‘input#username’, “username”);// 输入密码await page.type(‘input#password’, “testpass”);// 点击登录按钮await Promise.all([ page.waitForNavigation(), // 等跳转完成后resolve page.click(‘button.login-button’), // 点击该链接将间接导致导航(跳转)]);await page.waitFor(2000)// 获取cookiesconst cookies = await page.cookies()针对列表内容里的链接进行批量访问主要利用到page实例的选择器功能const table = await page.$(’.table’)const links = await table.$$eval(‘a.link-detail’, links => links.map(link => link.href));// 循环访问links…进行错误和访问监听puppeteer可以监听在页面访问过程中的报错,请求等等,这样我们就可以捕获到页面的访问错误并进行上报啦,这也是我们进行测试需要的基本功能~// 当发生页面js代码没有捕获的异常时触发。page.on(‘pagerror’, () => {})// 当页面崩溃时触发。page.on(’error’, () => {})// 当页面发送一个请求时触发page.on(‘request’)// 当页面的某个请求接收到对应的 response 时触发。page.on(‘response’)通过以上的几个小案例,我们发现Puppeteer的功能非常强大,完全能够满足我们以上的对页面进行自动访问的需求。接下来,我们针对我们的测试单元进行个单元用例的书写最终功能通过我们上面对测试单元的规划,我们可以规划一下我们的测试路径访问网站 -> 登陆 -> 访问页面1 -> 进行基本单元测试 -> 获取详情页跳转链接 -> 依次访问详情页 -> 进行基本单元测试-> 访问页面2 …所以,我们可以拆分出几个大类,和几个测试单元,来进行各项测试// 包含基本的测试方法,log输出等class Base {}// 详情页单元,进行一些基本的单元测试class PageDetal extends Base {}// 页面单元,进行基本的单元测试,并获取并依次访问详情页class Page extends PageDetal {}// 进行登录等操作,并依次访问页面单元进行测试class Root extends Base {}同时,我们如何在功能页面变化时,跟踪到测试的变化呢,我们可以针对我们测试的功能,为其添加自定义标签test-role,测试时,根据自定义标签进行测试逻辑的编写。例如针对时间切换单元,我们做一下简单的介绍:// 1. 获取测试单元的元素const timeSwitch = await page.$(’[test-role=“time-switch”]’);// 若页面没有timeSwitch, 则不用进行测试if (!timeSwitch) return// 2. time switch的切换按钮const buttons = timeSwitch.$$(’.time-switch-button’)// 3. 对按钮进行循环点击for (let i = 0; i < buttons.length; i++) { const button = buttons[i] // 点击按钮 await button.click() // 重点! 等待对应的内容出现时,才认定页面访问成功 try { await page.waitFor(’[test-role=“time-switch-content”]’) } catch (error) { reportError (error) } // 截图 await page.screenshot()}上面只是进行了一个简单的访问内容测试,我们可以根据我们的用例单元书写各自的测试逻辑,在我们日常开发时,只需要对需要测试的内容,加上对应的test-role即可。总结根据以上的功能划分,我们很好的将一整个应用拆分成各个测试单元进行单元测试。需要注意的是,我们目前仅仅是对页面的可访问性进行测试,仅仅验证当用户进行各种操作,访问各个页面单元时页面是否会出错。并没有对页面的具体展示效果进行测试,这样会和页面的功能内容耦合起来,就需要单独的测试用例的编写了。 ...

February 20, 2019 · 1 min · jiezi