• Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法1


    本文来源于:http://blog.csdn.net/zhubaitian/article/details/39293883

    Robotium的测试类ActivityInstrumentationTestCase2是继承于Junit3的TestCase类,所以并没有提供Junit4的特性.如网上总结说的:

      1、不能通过annotate的方式来识别子类的新特征,如不能实现@beforeclass,@afterclass等特征。只能通过写setup和teardown,

      2、TestCase只能以test开头进行测试case书写。

    那么有时我们并不想每次开始/完成一个case的时候都做一些重复的动作,也就是要实现Junit4的@beforeclass和@afterclass,该怎么办呢?
    以SDK自带的Notepad测试用例作为例子,假如现在我们需要实现两个测试用例
      1、testAddNoteCNTittle:创建一个中文标题的笔记

      2、testAddNoteEngTitle:创建一个英文标题的笔记

    根据实例提供的代码,在setup里面会初始化solo而在teardown里面会关闭所有打开的activities,也就是说每执行一个case都会重新初始化一次solo和关闭所有的activities:

     1 @Override
     2 public void setUp() throws Exception {
     3     //setUp() is run before a test case is started. 
     4     //This is where the solo object is created.
     5     super.setUp();
     6     this.activity = this.getActivity();
     7     this.solo = new Solo(getInstrumentation(), getActivity());
     8 }
     9     
    10 @Override
    11 public void tearDown() throws Exception {
    12     //tearDown() is run after a test case has finished. 
    13     //finishOpenedActivities() will finish all the activities that have been opened during the test execution.
    14     solo.finishOpenedActivities();
    15 }

    但事实上我们在这个脚本只是去创建两个Note,并不需要每执行完一个case都要去初始化solo和关闭所有activities。google后没有发现有现成的取代@beforeclass和@aferclass的方法。
    以下本人的实现方法

    package com.example.android.notepad.test;
    
    import com.robotium.solo.Solo;
    import android.test.ActivityInstrumentationTestCase2;
    import android.app.Activity;
    
    @SuppressWarnings("rawtypes")
    public class TCCreateNote extends ActivityInstrumentationTestCase2{
        private static Solo solo = null;
        public Activity activity;    
        private static final int NUMBER_TOTAL_CASES = 2;
        private static int run = 0;
        private static Class<?> launchActivityClass;
        //对应re-sign.jar生成出来的信息框里的两个值
        private static String mainActiviy = com.example.android.notepad.NotesList";
        private static String packageName = "com.example.android.notepad";
    
        static {
            try {
                launchActivityClass = Class.forName(mainActiviy);
        } catch (ClassNotFoundException e) {
                throw new RuntimeException(e);
        }
        }
    
        @SuppressWarnings("unchecked")
        public TCCreateNote() {
            super(packageName, launchActivityClass);
        }
    
        @Override
        public void setUp() throws Exception {
            //setUp() is run before a test case is started. 
            //This is where the solo object is created.
            super.setUp(); 
            //The variable solo has to be static, since every time after a case's finished, this class TCCreateNote would be re-instantiated
            // which would lead to soto to re-instantiated to be null if it's not set as static
            if(solo == null) {
                TCCreateNote.solo = new Solo(getInstrumentation(), getActivity());
            }
        }
        
        @Override
        public void tearDown() throws Exception {
            //Check whether it's the last case executed.
            run += countTestCases();
            if(run >= NUMBER_TOTAL_CASES) {
                solo.finishOpenedActivities();
            }
        }
    
        public void testAddNoteCNTitle() throws Exception {
            solo.clickOnMenuItem("Add note");
            solo.enterText(0, "中文标签笔记");
            solo.clickOnMenuItem("Save");
            solo.clickInList(0);
            solo.clearEditText(0);
            solo.enterText(0, "Text 1");
            solo.clickOnMenuItem("Save");
            solo.assertCurrentActivity("Expected NotesList Activity", "NotesList");        
            solo.clickLongOnText("中文标签笔记");
            solo.clickOnText("Delete");
        }
        
        public void testAddNoteEngTitle() throws Exception {
            solo.clickOnMenuItem("Add note");
            solo.enterText(0, "English Title Note");
            solo.clickOnMenuItem("Save");
            solo.clickInList(0);
            solo.clearEditText(0);
            solo.enterText(0, "Text 1");
            solo.clickOnMenuItem("Save");
            solo.assertCurrentActivity("Expected NotesList Activity", "NotesList");        
            solo.clickLongOnText("English Title Note");
            solo.clickOnText("Delete");
        }
    }                    
        
  • 相关阅读:
    Xtreme ToolkitPro 初使用
    VC 播放WAV文件
    Socket Select IO模型
    SpringBoot AOP 记录操作日志、异常日志
    基于 SpringBoot + Vue3.2 + Element Plus 的后台管理系统
    一个无限级树结构配合FlyTreeView的例子
    类似百度搜索的输入框自动完成功能
    PyQuery的安装
    CreateRemoteThread的调试问题
    OD中的自定义函数
  • 原文地址:https://www.cnblogs.com/dtest/p/4164286.html
Copyright © 2020-2023  润新知