当前位置: 首页 > news >正文

带屏蔽的网站做水晶头seo关键词是什么意思

带屏蔽的网站做水晶头,seo关键词是什么意思,wordpress4.6获取用户名方法,做网站 中企动力背景 主要是记录下Android项目使用jacoco生成代码覆盖率的实战流程#xff0c;目前已完成全量覆盖方案#xff0c;仅使用jacoco就能实现#xff1b; 由于我们的Android端是使用Java和kotlin语言,目前增量的方案code-diff仅针对Java代码#xff0c;卡在kotlin文件的分析目前已完成全量覆盖方案仅使用jacoco就能实现 由于我们的Android端是使用Java和kotlin语言,目前增量的方案code-diff仅针对Java代码卡在kotlin文件的分析仍在思考中。 Android由于是本地安装包只能使用offline模式 offline模式就是在测试之前先对文件进行插桩生成插过桩的class或jar包测试插过桩的class和jar包生成覆盖率信息到文件最后统一处理生成报告。在测试前先对文件进行插桩然后生成插过桩的class或jar包测试插过桩的class和jar包后会生成动态覆盖信息到文件最后统一对覆盖信息进行处理并生成报告。 使用场景 其实主要是基于两个痛点 1、新功能测试和回归测试在手工测试的情况下即便用例写的再怎么详细也经常会有漏测的发生这里一方面是因为现在大量互联网公司采用外包资源来做业务测试而外包的工作质量无法有效评估可能存在漏执行的情况另外一方面是本身测试用例设计的不够完善导致没有覆盖到一些关键路径的代码分支因此亟需一种可以度量手工测试完成后对代码覆盖情况的手段或者工具 2、研发代码变更的影响范围难以精准评估比如研发提交一个MR这个MR到底影响了多少用例在没有精准测试能力的情况下是很难给出的而做精准测试最重要的一环就是代码用例的关系库维护如何生成代码跟用例的关系就需要用到代码覆盖率的采集和分析能力了 引用简单两步实现 JacocoAndroid 代码覆盖率的接入!最新最全版 时机 1.提测时-明确整个版本迭代的改动范围测试范围全量代码diff 2.测试中-提交bug修复版本明确问题使用增量代码diff 3.预发布-关注关键点确保发布代码与测试代码一致全量代码diff 覆盖率对测试提升 1.能了解确认需求的实现逻辑对技术细节查漏补缺 2.评估影响范围 3.通过代码补充测试范围优化测试用例 4.加深系统实现的理解 5.提前发现错误 项目环境 1.gradle插件版本 ANDROID_GRADLE_PLUGIN 4.2.02.gradle依赖版本 distributionUrlhttps\://services.gradle.org/distributions/gradle-6.7.1-bin.zip3.android sdk版本 BUILD_TOOLS_VERSION 28.0.3 COMPILE_SDK 31 TARGET_SDK 31 MIN_SDK 21代码介入 1.在app模块下新建一个 jacoco.gradle apply plugin: jacoco jacoco {toolVersion 0.8.2 }android {//在app引入的时候指定对应的变体 会将内容传递引用的工程主要用于多模块使用defaultPublishConfig debugbuildTypes {debug {/**打开覆盖率统计开关**/testCoverageEnabled true}} } //源代码路径你有多少个module你就在这写多少个路径 //我这里是多模块的需要将主要代码的模块写上 def coverageSourceDirs [../lib.xx/src/main/java,../lib.xx/src/main/java,../lib.xx/src/main/java,../lib.xx/src/main/java,....../src/main/java,/src/mvp/java ]//class文件路径就是上面提到的class路径看你的工程class生成路径是什么替换一下就行 def coverageClassDirs [/lib.xx/build/intermediates/javac/debug/classes,/lib.xx/build/intermediates/javac/debug/classes,/lib.xx/build/intermediates/javac/debug/classes,/lib.xx/build/intermediates/javac/debug/classes,/app/build/intermediates/javac/debug/classes...... ] //kotlin的classes文件 def kotlinClassDirs [/lib.xx/build/tmp/kotlin-classes/debug/,/lib.xx/build/tmp/kotlin-classes/debug/,/lib.xx/build/tmp/kotlin-classes/debug/,/lib.xx/build/tmp/kotlin-classes/debug/,/app/build/tmp/kotlin-classes/debug/...... ]//这个就是具体解析ec文件的任务会根据我们指定的class路径、源码路径、ec路径进行解析输出 task jacocoTestReport(type: JacocoReport) {group Reportingdescription Generate Jacoco coverage reports after running tests.reports {xml.enabled(true)html.enabled(true)}//设置class文件的路径classDirectories.setFrom(files(coverageClassDirs.collect{fileTree(dir: $rootDirit,excludes: [**/R*.class,**/*$InjectAdapter.class,**/*$ModuleAdapter.class,**/*$ViewInjector*.class])}))classDirectories.setFrom(files(kotlinClassDirs.collect{fileTree(dir: $rootDirit,excludes: [**/R*.class,**/*$InjectAdapter.class,**/*$ModuleAdapter.class,**/*$ViewInjector*.class])}))//设置源码文件的路径sourceDirectories.setFrom(files(coverageSourceDirs)) //设置ec文件executionData.setFrom(files($buildDir/outputs/code_coverage/debugAndroidTest/connected/coverage.ec))doFirst {coverageClassDirs.each { path -println($rootDir path)new File($rootDir path).eachFileRecurse { file -if (file.name.contains($$)) {file.renameTo(file.path.replace($$, $))}}}} }2.在app模块下的build.gradle.kts引用jacoco.gradle并在buildtype为debug下开启覆盖率的开关 apply(from jacoco.gradle)//引入jacoco // 开发版本可打开开发者模式getByName(debug) {isMinifyEnabled false//引入jacocoisTestCoverageEnabled truezipAlignEnabled(false)3.定义采集覆盖率coverage.ec的方式网上的方式都是通过监听主activity Destroy后收集这里可以自己定义适合的方式比如在项目新增按钮点击采集。参考网上的代码可以直接用 在app的代码新建jacoco目录 添加一下代码 FinishListener package xx.app.jacoco;public interface FinishListener {void onActivityFinished();void dumpIntermediateCoverage(String filePath); }InstrumentedActivity package xx.app.jacoco;import xx.Activity;public class InstrumentedActivity extends Activity {public FinishListener finishListener;public void setFinishListener(FinishListener finishListener) {this.finishListener finishListener;}Overridepublic void onDestroy() {if (this.finishListener ! null) {finishListener.onActivityFinished();}super.onDestroy();} }JacocoInstrumentation public class JacocoInstrumentation extends Instrumentation implements FinishListener {public static String TAG JacocoInstrumentation:;SuppressLint(SdCardPath)private static String DEFAULT_COVERAGE_FILE_PATH /mnt/sdcard/coverage.ec;private final Bundle mResults new Bundle();private Intent mIntent;private static final boolean LOGD true;private boolean mCoverage true;private String mCoverageFilePath;public JacocoInstrumentation() {}Overridepublic void onCreate(Bundle arguments) {Log.e(TAG, onCreate( arguments ));super.onCreate(arguments);DEFAULT_COVERAGE_FILE_PATH getContext().getFilesDir().getPath() /coverage.ec;File file new File(DEFAULT_COVERAGE_FILE_PATH);if (file.isFile() file.exists()) {if (file.delete()) {Log.e(TAG, file del successs);} else {Log.e(TAG, file del fail !);}}if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {Log.e(TAG, 异常 : e);e.printStackTrace();}}if (arguments ! null) {Log.e(TAG, arguments不为空 : arguments);mCoverageFilePath arguments.getString(coverageFile);Log.e(TAG, mCoverageFilePath mCoverageFilePath);}mIntent new Intent(getTargetContext(), InstrumentedActivity.class);mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);start();}Overridepublic void onStart() {Log.e(TAG, onStart def);if (LOGD) {Log.e(TAG, onStart());}super.onStart();Looper.prepare();InstrumentedActivity activity (InstrumentedActivity) startActivitySync(mIntent);activity.setFinishListener(this);}private boolean getBooleanArgument(Bundle arguments, String tag) {String tagString arguments.getString(tag);return tagString ! null Boolean.parseBoolean(tagString);}private void generateCoverageReport() {OutputStream out null;try {out new FileOutputStream(getCoverageFilePath(), false);Object agent Class.forName(org.jacoco.agent.rt.RT).getMethod(getAgent).invoke(null);out.write((byte[]) agent.getClass().getMethod(getExecutionData, boolean.class).invoke(agent, false));} catch (Exception e) {Log.e(TAG, e.toString());e.printStackTrace();} finally {if (out ! null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}private String getCoverageFilePath() {if (mCoverageFilePath null) {return DEFAULT_COVERAGE_FILE_PATH;} else {return mCoverageFilePath;}}private boolean setCoverageFilePath(String filePath) {if (filePath ! null filePath.length() 0) {mCoverageFilePath filePath;return true;}return false;}private void reportEmmaError(Exception e) {reportEmmaError(, e);}private void reportEmmaError(String hint, Exception e) {String msg Failed to generate emma coverage. hint;Log.e(TAG, msg);mResults.putString(Instrumentation.REPORT_KEY_STREAMRESULT, \nError: msg);}Overridepublic void onActivityFinished() {if (LOGD) {Log.e(TAG, onActivityFinished());}if (mCoverage) {Log.e(TAG, onActivityFinished mCoverage true);generateCoverageReport();}finish(Activity.RESULT_OK, mResults);}Overridepublic void dumpIntermediateCoverage(String filePath) {// TODO Auto-generated method stubif (LOGD) {Log.e(TAG, Intermidate Dump Called with file name : filePath);}if (mCoverage) {if (!setCoverageFilePath(filePath)) {if (LOGD) {Log.e(TAG, Unable to set the given file path: filePath as dump target.);}}generateCoverageReport();setCoverageFilePath(DEFAULT_COVERAGE_FILE_PATH);}} }配置AndroidManifest.xml !--引入jacoco--activity android:name.jacoco.InstrumentedActivityandroid:labelInstrumentationActivity/ !--引入jacoco--instrumentationandroid:name.jacoco.JacocoInstrumentationandroid:handleProfilingtrueandroid:labelCoverageInstrumentationandroid:targetPackage包名 /统计子module的覆盖率 因为很多Android项目肯定不只要app module有很多子module提供使用需要一起统计覆盖率 目前的做法是在jacoco.gradle 加上参数 defaultPublishConfig “debug” android {//在app 引入的时候指定对应的变体 会将内容传递引用的工程主要用于多模块使用defaultPublishConfig debugbuildTypes {debug {/**打开覆盖率统计开关**/testCoverageEnabled true}} }然后让子module去引用这就需要修改子module的build.gradle一行代码完成 //在子模块引入jacoco apply(from ../app/jacoco.gradle)实战使用 1.通过命令行打debug安装包 installDebug 或者 gradlew app都行 2.通过instrument 启动app 安装完后先打开app再退出一下不然启动不了 adb shell pm list instrumentation //会看到以下信息 instrumentation:xx.app/.jacoco.JacocoInstrumentation (targetxx.app) //然后复制启动 adb shell am instrument xx.app/.jacoco.JacocoInstrumentation3.执行测试 4.完成测试后在主页面退出app 5.通过Android stdio的device file explorer复制出coverage.ec 路径 /data/data/xx.app/files/coverage.ec 6.将coverage.ec复制到项目文件\app\build\outputs\code_coverage\debugAndroidTest\connected下如没有的话新建 7.用命令jacocoTestReport生成报告报名路径如下 \app\build\reports\jacoco\jacocoTestReport\html 增量代码覆盖率 使用code-diff 和 jacoco二开 用code-diff获取两个commit之间的代码差异然后生成json文件使用jacoco二开的jar包通过 –diffCodeFiles 传入差异代码json文件然后只生成差异代码文件的覆盖报告 总结KT文件需要改造code-diff才能用目前只能用于java后续看看怎么修改。 引用下该作者的话总结得很好学习学习 代码覆盖率100% 不代表没有bug。代码没有覆盖100% 一定有bug 但是有可能你覆盖到80% 很轻松往后增加5% 都费很大劲。那么我们可以去没有覆盖到的进行分析。不一定要做到代码100%全覆盖尤其在功能测试阶段代码100% 覆盖会给大家增加很多的工作量很有可能为了1%的覆盖率而耽误整体测试得不偿失。 覆盖率是为了提升我们测试用例的覆盖度检验我们测试用例设计的全面性它有两面性合理引入覆盖率合理选择一定的阈值。 https://cloud.tencent.com.cn/developer/article/1801772
http://www.hkea.cn/news/14390863/

相关文章:

  • win7 发布asp网站哪个公司的app软件定制
  • 做企业网站的哪家好wordpress 不显示菜单
  • 网站设计建网站2023今天的新闻联播
  • 便民类网站 做wordpress 手册插件
  • 用群晖nas做网站南山做网站
  • 广州高档网站建设网站设计框架
  • 网站开发流程及详解站长工具seo
  • 下载wix做的网站织梦网站开通在线投稿
  • 网站建设经费预算包括哪些wordpress 翻译
  • 余姚市城乡建设局网站cms系统搭建
  • 个人建网站一般多少钱?中国建设银行门户网站企业
  • 网站分析步骤哪个网站可以学做咸菜
  • 哪有做网站的宁波外贸网站建设和推广
  • 网站建设运营执行方案怎么做ppt教程网站
  • 山东网站建设好不好手机网站怎么做沉浸式
  • 哪个网站做推广做的最好超级搜索引擎
  • 东莞网站建设 鞋材厂wordpress页面移动端
  • 过年做哪个网站能致富网络投票程序
  • 网站风格趋势品牌推广与传播怎么写
  • 成都防疫政策最新北京seo排名外包
  • 网站建设留言板怎么做个人网站建设怎么赚钱
  • 教师做课题可以参考什么网站制作网站几个步骤
  • 合肥建站软件云服务器5元左右的
  • 网站建设logo设计网站分几类
  • 移动网站建设自助建站医院做网站备案需要哪些资料
  • 网站中添加百度地图搜索引擎优化简称
  • 成都住建局官网报名被挤爆黑幕自学seo能找到工作吗
  • 关于加强门户网站建设查企业公司用什么软件
  • 做音乐网站要什么源码济南住宅与房地产信息网官方网站
  • 青岛网站建设免费网站建设礻金手指下拉十一