2011-03-14 13:46:17 iteye_21201 阅读数 67
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26370 人正在学习 去看看 任苹蜻
KEY:Android JUnit Android单元测试 单元测试

Menifest.xml中加入:
<application>中加入:

<uses-library android:name="android.test.runner" />

<application>外面加入:

<uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />

<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.***.***【您的项目包名】"

android:label="JUnit Test"/>

编写单元测试代码:必须继承自AndroidTestCase类


import android.test.AndroidTestCase;

import junit.framework.Assert;



public class JUnitTest extends AndroidTestCase {

private static final String Tag="JUnitTest";



public void testOne() throws Throwable

{

int i=1 + 1;

Assert.assertEquals(2,i);

}



public void testOther() throws Throwable {

Assert.assertTrue(1 + 1 == 12);

}

}
Eclipse下选择运行>>Android JUnit Test ,就OK了
2016-09-30 17:14:02 yepeng2014 阅读数 395
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26370 人正在学习 去看看 任苹蜻

android studio 单元测试

android studio新建项目会自动创建一个单元测试目录,如下图:
这里写图片描述
里面代码如下:

package com.example.xx.myapplication;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.xx.myapplication", appContext.getPackageName());
    }
}

右键点击运行测试
这里写图片描述

结果:
这里写图片描述

2018-04-14 14:38:58 u013144863 阅读数 125
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26370 人正在学习 去看看 任苹蜻

本篇介绍Android相关的单元测试, 本篇为系列教程的开篇, 对Android单元测试做一个系统介绍.

本系列教程将介绍在Android应用中如何编写本地单元测试和instrumentation测试(设备测试).并通过Android Studio和Gradle来执行这些测试.

Android单元测试分类

Android应用运行在各种各样的设备中.另外,Android框架和其他相关的开源框架都在高速发展.要保证应用正常运行,有必要去写Android应用测试.这将会有助于优化和改善我们的Android应用.

Android的单元测试分为下列两种:

  • 本地单元测试 - 即测试用例运行在JVM中
  • Instrumented 单元测试 - 即测试用例需要Android 系统支持,运行在真机或模拟器中

Android测试分类

相对于在Android设备上部署和运行测试所需的时间,本地的单元测试速度要快很多.如果你需要真正的Android系统环境,应首选本地单元测试,并且仅在Android平台上运行.

如果使用本地单元测试并对Android API有依赖,应该通过模拟框架(mocking framework)来替代它们,例如Mockito.

测试分布法则

我们应该把测试的关注点放在代码的业务逻辑上,下面几条是非常好的测试分布法则:

  • 70-80 % 单元测试来确保基础代码的稳定性
  • 20-30 % 功能测试来确保应用程序的功能正常工作
  • 如果应用程序与其他应用程序组件集成起来,则需要进行一些跨功能测试

测试分布规则

应该至少在一个设备上测试应用,并尽可能的减少配置.另外也应该在具有最高可用配置(例如像素密度,屏幕分辨率)的设备上进行测试,以确保其在这些设备上正常工作.

Android测试工具支持

Google的Android测试支持库(ATSL)项目为Android测试提供了工具. 例如 AndroidJUnitRunner.

如果你运行本地单元测试,那么工具会创建一个特殊版本的android.jar (也被称为Android 模拟Jar包). 这个被修改后的 JAR 文件用来提供给单元测试,以便所有Android库中的字段,方法和类都可用. 在默认情况下,对Android可模拟JAR的任何调用都会导致异常,但是你可以将Android配置为返回默认值.当然最好的方式是使用一些Mock库,具体详情可以见Android Developer官方文档.

该库提供了JUnit兼容的测试运行器(AndroidJunitRunner)、Espresso测试框架和UI Automator 测试框架. Espresso测试框架可用于测试应用程序的用户界面,UI Automator 允许编写跨应用程序的功能测试.

AndroidJunitRunner 通过InstrumentationRegistery 提供了对 instrumentation API 的访问.

  • InstrumentationRegistry.getInstrumentation(), 返回当前运行的Instrumentation
  • InstrumentationRegistry.getContext(), 返回Instrumentation包下的Context
  • InstrumentationRegistry.getTargetContext(), 返回目前应用的Context
  • InstrumentationRegistry.getArguments(), 返回传递给此Instrumentation的参数Bundle的副本.当你想访问传递给你测试工具的命令行参数时非常有用

它还可以通过ActivityLifecycleMonitorRegistry访问生命周期.

Android工程测试结构

以下是你的应用和测试代码的默认目录结构:

  • app/src/main/java - 主要应用程序构建的源代码
  • app/src/test/java - 用于任何可以运行在JVM单元测试
  • app/src/androidTest/java - 用于应该运行在Android设备上的测试

遵循上述结构,Android的构建系统就会在相应的目标(JVM或者Android设备)运行测试.

解决”error duplicate files in path”的错误

如果你收到下面的错误:”error duplicate files in path. Path in archive: LICENSE.txt”,你可以将以下内容添加到app/build.gradle文件中:

android {
    packagingOptions {
    exclude 'LICENSE.txt'
    }
}

敲行代码再睡觉

2014-07-16 22:11:41 bq1073100909 阅读数 685
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26370 人正在学习 去看看 任苹蜻

Android单元测试:

新建项目junitTest:

新建测试服务 TestService.java

代码如下:


package org.dyb.service;

public class PersonService {
	public void save(String name){
		String sub=name.substring(6);
	}
	public int add(int a,int b){
		return a+b;
	}
}

新建STest.java类,继承AndroidTestCase类
进行单元测试:

代码如下:

package org.dyb.test;

import junit.framework.Assert;

import org.dyb.service.PersonService;

import android.test.AndroidTestCase;

public class STest extends AndroidTestCase {
	public void testSave() throws Exception{
		PersonService personService=new PersonService();
		personService.save("qweqwfwqfqfqw");
	}
	public void testadd()throws Exception{
		PersonService personService=new PersonService();
		int actual = personService.add(1, 2);
		Assert.assertEquals(6, actual);
	}
}
一切都搞定后就要在系统部署配置文件AndroidManifest.xml中进行配置:

在<application></application>中加入:

<uses-library android:name="android.test.runner"/>


在<manifest></manifest>中加入:

<instrumentation android:name="android.test.InstrumentationTestRunner" 
	    android:targetPackage="xxxx.xxxx.xxx" android:label="test for my app"/>

其中xxxx.xxxx.xxx代表你的包名,不是测试的包也不是服务service的包,而是你的<manifest>中属性package的包,程序入口包。

然后在STest.java中右键run as --> android junit test 就OK了

2018-12-29 15:52:58 gongsunjinqian 阅读数 370
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26370 人正在学习 去看看 任苹蜻

前言

我们的测试用聚焦在应用程序的业务逻辑上,凭经验来说一个好的单元测试应该有如下测试分布:

70-80 % 是单元测试,保证基础代码功能的稳定

20-30 % 功能性测试,保证我们的应用程序可以运行

如果我们继承了其他应用组件的话,还需一部分交叉功能测试。

Android测试分类

Android测试分为本地测试(Local Unit Tests)和仪器测试(Instrumented Tests):

本地测试:

运行速度快;

无需连接Android真机或者模拟器;

对应目录是src/test/目录;

生成的报告文件是*.exec;

可视化查看报告目录:可在Android studio自带的coverage侧边栏插件更直观的查看。

仪器测试:

运行速度慢;

需要连接Android真机或者模拟器;

对应目录是src/androidTest/目录;

生成的报告文件是*.ec;

可视化查看报告目录:YOUR_PROJECT_PATH\app\build\reports\coverage\debug\index.html

测试报告生成
由于仪器测试运行速度慢,需要连接设备等不便因素影响,暂时只提供本地测试对接sonar配置。

希望Sonar上体现测试覆盖率时,则需将生成的报告文件提交到sonar。

第一步 修改工程根目录下build.gradle文件

这里用的jacoco插件用的是vanniktech提供的jacoco,另外gradle默认支持的是EclEmma提供的jacoco插件。

之所以不选用gradle默认的jacoco插件,是因为其不支持productFlavors配置,而vanniktech修复了该Bug。

vanniktech支持productFlavors修复反馈

Gradle Jacoco Plugin By Vanniktech

Gradle Jacoco Plugin By Default

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.vanniktech:gradle-android-junit-jacoco-plugin:0.13.0"
  }
}

apply plugin: "com.vanniktech.android.junit.jacoco"
apply from: 'sonarqube.gradle'//create new sonar config.

第二步 创建sonarqube.gradle

这里创建sonarqube.gradle,一方面统一并完善sonar配置,一方面添加测试报告关联配置。

创建sonarqube.gradle于工程根目录下,

apply plugin: "org.sonarqube"

ext {
    SONAR_HOST = "http://...sonar-server-url...:9000/"
}

sonarqube {
    properties {
        property "sonar.host.url", SONAR_HOST
		//projectName根据QA要求命名
        property "sonar.projectName", "longfor-xxx"
		//projectKey建议使用项目的applicationId,注意相同的projectName,但不同的projectKey将在sonarqube上生成两个不同的项目!
        property "sonar.projectKey", rootProject.ext.applicationId
        property "sonar.sourceEncoding", "UTF-8"
        //Excluding src/androidTest/** and src/test/** is not allowed!
		//exclusions可以配置多个,以逗号分割
        property "sonar.exclusions", "src/main/res/**"

        property "sonar.sources", "src/main/"
        property "sonar.tests", "src/test/"
		//本地测试(Local Unit Tests)报告上传配置,注意sonar.jacoco.reportPath已弃用,使用sonar.jacoco.reportPaths.
        property "sonar.jacoco.reportPaths", fileTree(dir: project.projectDir, includes: ['**/*.exec'])
		//Instrumented Tests报告上传,目前未做上传
//        property "sonar.jacoco.itReportPath", fileTree(dir: project.projectDir, includes: ['**/*.ec'])
    }
}


//针对项目中其他Library Module进行单独配置
project(":base") {
    sonarqube {
		//不扫描该Module
        skipProject = true
    }
}


project(":biz") {
    sonarqube {
        properties {
			//不扫描该Module下的指定目录
            property "sonar.exclusions", "build/**," +
                    "src/main/res/**," +
                    "src/main/java/db/**"
        }
    }
}

第三步 修改主模块(Application Module)目录下build.gradle

Application Module即为build.gradle中声明

apply plugin: 'com.android.application'
的Module。

在其build.gradle中 添加 本地单元测试插件:

dependencies {
    ...此处省略其他包依赖
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
	...此处省略其他包依赖
}

第四步 运行上传命令

//将buildType为debug环境下的扫描报告上传sonar。注意指令顺序!!!
gradle jacocoTestReportDebug sonarqube --stacktrace

注意:

gradle 语句: 该命令因电脑系统mac/window,本地有无特殊配置而不同,其他写法有:./gradle ./gradlew等
jacocoTestReportDebug 语句: 该语句语法为jacocoTestReport,
即,在没有配置productFlavors的项目中只有jacocoTestReportDebug和jacocoTestReportRelease,
如果在productFlavors中配置了dev和uat,那么将会有:jacocoTestReportdevDebug,jacocoTestReportuatDebug,jacocoTestReportdevRelease,jacocoTestReportuatRelease.
sonarqube 语句: 上传到sonarqube.
–stacktrace 语句: 用于打印出生成测试报告,上传soanrqube过程中的报错信息,可写可不写。

本地单元测试代码示例
src/main/源代码:

public class StringUtils {
    private StringUtils() {
    }

    public static boolean isNull(String s) {
       return null == s || s.trim().length() <= 0;
    }

    public static boolean canParseInt(String s) {
        try {
            Integer.parseInt(s);
            return true;
        } catch (Exception e) {

        }
        return false;
    }
}

src/test/源代码:

public class StringUtilsTest {
    private String canParseInt_Value;

    @Before
    public void setUp() throws Exception {
        canParseInt_Value = "6";
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void isNull() {
        assertThat(StringUtils.isNull(""), is(true));
        assertThat(StringUtils.isNull(null), is(true));
        assertThat(StringUtils.isNull("ab"), is(false));
    }

    @Test
    public void canParseInt() {
        assertThat(StringUtils.canParseInt(canParseInt_Value), is(true));
        assertThat(StringUtils.canParseInt("a"), is(false));
    }
}

注意事项

1、sonar配置中,相同的projectName,但不同的projectKey将在sonarqube上生成两个不同的项目!

没有更多推荐了,返回首页