51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1823|回复: 0
打印 上一主题 下一主题

高效建立健壮的Android应用-Maven Android 开发

[复制链接]
  • TA的每日心情
    奋斗
    2021-8-6 16:14
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2019-3-27 15:00:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    高效建立健壮的Android应用

    第一次写(翻译)这么长的文章,请多包含. 本标题纯粹是别人的广告语,它说他可以

    • 让你开发更加迅速
    • 让你的应用更加强壮
    • 提高应用的质量
    • 构建你的企业解决方案
    • 而且还是免费开源(我加的)

    它包含以下组件:
    • 日志


    1. import de.akquinet.android.androlog.Log;
    2. import android.app.Activity;
    3. import android.os.Bundle;

    4. public class MyActivity extends Activity {
    5.      /** Called when the activity is first created. */
    6.      @Override
    7.      public void onCreate(Bundle savedInstanceState) {
    8.          super.onCreate(savedInstanceState);

    9.          // Initializes androlog
    10.          // This will read /sdcard/my.application.properties
    11.          Log.init(this);

    12.          // Log a message
    13.          Log.i(this, "This is a logged message");

    14.          setContentView(R.layout.main);
    15.      }
    16. }
    复制代码
    2.快速测试
    1. public void testValidAuth() throws Exception {
    2.          activity().view().withId(R.id.username).setText("testuser");
    3.          activity().view().withId(R.id.password).setText("testpw");

    4.          activity().view().withId(R.id.buttonSubmit).click();

    5.          NextActivity nextActivity = await().activity(
    6.              NextActivity.class, 10, TimeUnit.SECONDS);
    7.                  assertThat(nextActivity, notNullValue());
    8.                  assertThat(activity(nextActivity).view().
    9.              withId(R.id.nextActivityContent), hasText("success"));
    10. }
    复制代码
    • 持续集成和测试你的应用

    • 让你的应用可以直接上架(With ProGuard to AppStore)

    • 获得应用的错误等日志反馈

    • 构建企业应用程序

      企业应用程序有不同的要求,与后端系统的有关部署,安全和通信。它为在Android上构建企业解决方案提供了几个组件:

      交货门户网站:管理用户和交付/更新/管理您的应用程序在空中。

      先进的后端连接:易于与您的后端使用REST,Web服务,JSON或protobuf的沟通。支持几种加密方法,以及使用云服务。 从现场设备的数据同步:保持与后端同步,支持离线模式,合并。

      隐私权存储:提高你的设备上的数据通过加密和您的应用程序的私有数据的安全性。

      使用STAND,你可以轻松地构建基于Android的企业级解决方案。


    详细介绍
    1. mvn archetype:generate \
    2.    -DarchetypeArtifactId=android-quickstart \
    3.    -DarchetypeGroupId=de.akquinet.android.archetypes \
    4.    -DarchetypeVersion=1.0.11 \
    5.    -DgroupId=your.company \
    6.    -DartifactId=my-android-application
    复制代码
    • 源代码:Github

    • ANDROLOG

      Maven依赖


    1. <dependency>
    2.    <groupId>de.akquinet.android.androlog</groupId>
    3.    <artifactId>androlog</artifactId>
    4.    <version>1.0.1</version>
    5.    <scope>compile</scope>
    6. </dependency>
    复制代码
    使用方法1(跟Android log一样使用,无需配置):
    1. import de.akquinet.android.androlog.Log;

    2. public class AndrologExample {
    3.      public static final String TAG = "MY_TAG";
    4.      public void doSomething() {
    5.          Log.i(TAG, "A message");
    6.      }
    7. }
    复制代码
    使用方法2:
    1. import de.akquinet.android.androlog.Log;
    2. import android.app.Activity;
    3. import android.os.Bundle;

    4. public class MyActivity extends Activity {
    5.      /** Called when the activity is first created. */
    6.      @Override
    7.      public void onCreate(Bundle savedInstanceState) {
    8.          super.onCreate(savedInstanceState);

    9.          // Initializes androlog
    10.          // This will read the /sdcard/my.application.properties file
    11.          Log.init(this);

    12.          // Log a messgage
    13.          Log.i(this, "This is a logged message");

    14.          setContentView(R.layout.main);
    15.      }
    16. }
    复制代码

    配置:

    文件名是包名+.properties.是不是很简单?

    格式如下:

    1. androlog.active = true|false

    2. androlog.default.level=VERBOSE|DEBUG|INFO|WARN|ERROR 默认Info

    3. org.package.name = info    //这个格式很眼熟吧?

    4. androlog.delegate.wtf = false  //如果你的系统低于2.3则需要这样设置以免报错
    复制代码

    发布前提条件,在~/.m2/settings.xml定义

    1. <profiles>
    2.    <profile>
    3.      <id>android</id>
    4.     <properties>
    5.       <!-- CHANGE HERE -->
    6.       <sdk.path>/Users/clement/dev/android</sdk.path>
    7.     </properties>
    8.     </profile>
    9.     <!-- others profiles -->
    10. </profiles>
    11. <activeProfiles>
    12.      <activeProfile>android</activeProfile>
    13. </activeProfiles>
    复制代码
    • 源代码:Github

    • 更好的单元测试工具 - MARVIN

      Maven依赖:


    1. <dependency>
    2.      <groupId>de.akquinet.android.marvin</groupId>
    3.      <artifactId>marvin</artifactId>
    4.      <version>1.1.0</version>
    5.      <<scope>compile</scope>
    6. </dependency>
    复制代码
    原生的测试方法:
    1. public class LoginActivityTest extends AndroidTestCase {
    2.      public void testLogin() {
    3.          Instrumentation instrumentation = getInstrumentation();

    4.          ActivityMonitor monitor = instrumentation
    5.              .addMonitor(MainActivity.class.getName(), null, false);
    6.          Intent intent = new Intent(Intent.ACTION_MAIN);
    7.          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    8.          intent.setClassName(instrumentation.getTargetContext(),
    9.              LoginActivity.class.getName());
    10.          final LoginActivity loginActivity=
    11.              (LoginActivity) instrumentation.startActivitySync(intent);
    12.          instrumentation.waitForIdleSync();

    13.          injectViewTestActivity.runOnUiThread(new Runnable() {
    14.              public void run() {
    15.                  EditText username = loginActivity
    16.                      .findViewById(R.id.username);
    17.                  EditText password = loginActivity
    18.                      .findViewById(R.id.password);

    19.                  username.setText("Username");        // Step 1
    20.                  password.setText("Password");        // Step 2
    21.                  loginActivity.findViewById(R.id.loginbutton)
    22.                      .performClick();        // Step 3
    23.              }
    24.          });

    25.          Activity mainActivity = instrumentation
    26.              .waitForMonitorWithTimeout(monitor, 30000); // Step 4
    27.          assertNotNull(mainActivity); // Step 5
    28.      }
    29. }
    复制代码
    更好的测试方法(译者:你认为呢?):
    1. public class LoginActivityTest extends ActivityTestCase<> {
    2.      public LoginActivityTest(Class activityType) {
    3.          super(LoginActivity.class);
    4.      }

    5.      public void testLogin() {
    6.          // Step 1
    7.          activity().view().withId(R.id.username).setText("Username");
    8.          // Step 2
    9.          activity().view().withId(R.id.password).setText("Password");
    10.          // Step 3
    11.          activity().view().withId(R.id.loginbutton).click();
    12.          // Step 4
    13.          Activity mainActivity = await().activity(MainActivity.class, 30,
    14.              TimeUnit.SECONDS);
    15.          assertNotNull(mainActivity); //Step 5
    16.      }
    17. }
    复制代码

    总结:

    使用Marvin,你的测试可以继承以下几个的类:AndroidTestCase, AndroidActivityTestCase, AndroidServiceTestCase.提供以下perform(), await() 和 activity() 或者 view()的交互方法.还支持HAMCREST Matcher, 还有几个全局监控类:

    1. getMostRecentlyStartedActivity() - 返回最后的已经开启的


    2. activitygetStartedActivities() - 返回所有当前正在运行的activity

    3. waitForActivity(Class, long, TimeUnit) - 延时启动特定activity
    复制代码
    • 源代码:Github

    • 简化开发难度(代码工人的福音)

      简单介绍: 使用roboject必须继承RobojectActivity,包括几个可用的注解


      • @InjectLayout: Injects an XML layout to your activity.

      • @InjectView: Inject an XML view to a field of your activity.

      • @InjectExtra: Inject an Intent extra passed from another activity to a field of your activity.

      • @InjectService: Inject the binder object of a service to a field of your activity.


      And two additional methods:
      • onServicesConnected: Runs in brackground and is called, when all Services were bound. Use this method to process time consuming parts, such as clietn requests to a server.
      • onReady: Is called subsequently to onServicesConnected on the UI-Thread. Manipulate the layout here.

      源代码:Github


    最后

    All STAND frameworks are available under the Apache License 2.0


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 01:39 , Processed in 0.063123 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表