Robotium 测试资料2

如果大家配置好了Robotium的 测试环境,那么开始吧(这里只介绍有源码的情况,没有源码也是可以做的)

  被测应用下载:http://download.csdn.net/detail/wirelessqa/4487252

  测试代码 (只贴出MainActivity和GridView,用例很简单就不多作注释了)

  大家可以对照着Athrun的用例来看看两个框架的区别

  [java] view plaincopypackage org.onceler.robotium.test;

  import java.util.ArrayList;

  import org.athrun.android.app.MainActivity;

  import org.athrun.android.app.R;

  import org.athrun.android.app.ScrollActivity;

  import android.test.ActivityInstrumentationTestCase2;

  import android.test.suitebuilder.annotation.Smoke;

  import android.util.Log;

  import android.view.KeyEvent;

  import android.view.View;

  import android.widget.TextView;

  import com.jayway.android.robotium.solo.Solo;

  public class MainActivityTest extends ActivityInstrumentationTestCase2{

  private Solo solo;

  private TextView tv;

  private static final String TAG = "robotium_test";

  public MainActivityTest() {

  super("org.athrun.android.app", MainActivity.class);

  }

  public void setUp() throws Exception {

  solo = new Solo(getInstrumentation(), getActivity());

  }

  @Override

  public void tearDown() throws Exception {

  //Robotium will finish all the activities that have been opened

  solo.finishOpenedActivities();

  }

  @Smoke

  public void testWaitForActivity(){

  solo.assertCurrentActivity("assert activity err", MainActivity.class);

  solo.assertCurrentActivity("assert activity err", "MainActivity");

  solo.assertCurrentActivity("assert activity err", MainActivity.class, true);

  solo.assertCurrentActivity("assert activity err", "MainActivity", true);

  solo.clickOnButton("ScrollView");

  solo.assertCurrentActivity("assert activity err", ScrollActivity.class);

  solo.goBack();

  solo.clickOnButton(4);

  solo.assertCurrentActivity("assert activity err", "ScrollActivity");

  solo.goBackToActivity("MainActivity");

  solo.assertCurrentActivity("assert activity err", "MainActivity", true);

  }

  @Smoke

  public void testFindElementInTree(){

  ArrayList list = solo.getViews(solo.getView(R.id.include_checkbox));

  tv = (TextView)list.get(2);

  assertEquals("default text",tv.getText());

  solo.clickOnCheckBox(0);

  tv = (TextView)list.get(2);

  assertEquals("CheckBox is checked!",tv.getText());

  }

  public void testFindViewByIdDirect() {

  //通过ID得到view

  tv = (TextView)solo.getView(R.id.textview);

  assertEquals("default text",tv.getText());

  solo.clickOnCheckBox(0);

  tv = (TextView)solo.getView(R.id.textview);

  assertEquals("CheckBox is checked!",tv.getText());

  }

  public void testLongClick(){

  //ImageView iv = (ImageView)solo.getView(R.id.my_imageview);

  solo.clickLongOnView(solo.getView(R.id.my_imageview));

  //这个TOAST提示捕获不到,不知道哪里有问题,知道的朋友可以跟我说一下

  // assertEquals(true,solo.waitForText("LongClick"));

  }

  public void testPressMenu(){

  solo.clickOnMenuItem("Toast");

  //这个TOAST跟上面的一样,这个确是成功的。OH MY GOD,这是为何

  assertEquals(true,solo.waitForText("Hello World"));

  }

  public void testPressHome(){

  solo.sendKey(KeyEvent.KEYCODE_HOME);

  solo.sleep(2000);

  }

  public void testPressBack(){

  solo.clickOnButton("ScrollView");

  solo.clickOnButton("Bottom Button");

  solo.sendKey(KeyEvent.KEYCODE_BACK);

  solo.assertCurrentActivity("assert activity err", "MainActivity");

  }

  public void testFindViewByText(){

  solo.clickOnButton("ListView");

  solo.clickLongOnText("Item35");

  solo.clickOnText("Item One");

  assertTrue(solo.waitForText("1 pressed!"));

  }

  public void testScrollListInDialog(){

  solo.clickOnMenuItem("Dialog With List");

  solo.clickOnText("Item9");

 

assertTrue(solo.waitForText("Item 9 clicked!"));

  solo.clickOnButton("OK");

  assertTrue(solo.waitForText("Botton OK in dialog with list is pressed!"));

  }

  public void testSetScreen() {

  solo.setActivityOrientation( Solo.LANDSCAPE);

  solo.setActivityOrientation(Solo.PORTRAIT);

  solo.sleep(2000);

  }

  public void testGetStringById(){

  solo.clickOnButton("ScrollView");

  assertTrue(solo.getString(R.string.scroll_text).toString().contains("道可道"));

  }

  public void testRequestFocus(){

  //好像没有直接获得焦点的方法,所以。。慢慢移动吧

  }

  public void testSlide(){

  //gallery的操作方法没有

  //左右滑动用 solo.scrollToSide(Solo.LEFT);

  }

  public void testGetChildCount(){

  Log.i(TAG, String.valueOf(solo.getViews().size())); //所有的VIEW数量

  Log.i(TAG, String.valueOf(solo.getViews(solo.getView(R.id.mainroot)).size()));//LinearLayout下的VIEW数量

  Log.i(TAG, String.valueOf(solo.getViews(solo.getView(R.id.my_gallery)).size()));//GALLERY下的VIEW数量

  }

  }

  GridView

  [java] view plaincopypackage org.onceler.robotium.test;

  import org.athrun.android.app.GridViewActivity;

  import org.athrun.android.app.ListViewActivity;

  import android.test.ActivityInstrumentationTestCase2;

  import com.jayway.android.robotium.solo.Solo;

  public class GridViewActivityTest extends ActivityInstrumentationTestCase2{

  private Solo solo;

  private static final String TAG = "robotium_test";

  public GridViewActivityTest() {

  super("org.athrun.android.app", GridViewActivity.class);

  }

  public void setUp() throws Exception {

  solo = new Solo(getInstrumentation(), getActivity());

  }

  @Override

  public void tearDown() throws Exception {

  //Robotium will finish all the activities that have been opened

  solo.finishOpenedActivities();

  }

  public void testGetChildByIndex(){

  // solo.clickOnText("Item.0");

  solo.clickOnImage(0);

  assertTrue(solo.waitForText("Item 0 is clicked!"));

  solo.assertCurrentActivity("current activity is not ListViewActivity", ListViewActivity.class);

  }

  public void testGetChildByIndexMixed(){

  solo.clickOnText("Item.19");

  assertTrue(solo.waitForText("Item 19 is clicked!"));

  solo.sleep(1000);

  //接下来没有办法直接获得哪一行的TEXT,ATHRUN就可以

  //所以只能通过INDEX来查找

  solo.getText(40); //这个有问题,被测应用的问题

  //移动到第20行可以像下面这样OH MY GOD,好慢

  // for(int i = 0;i<21;i++){

  // solo.sendKey(Solo.DOWN);

  // }

  }

  }

 /测试问题

常见的Robotium测试的问题总结:

1、 Robotium 的测试类ActivityInstrumentationTestCase2继承了TestCase类,即robotiom的测试类是junit3的实例,并没有junit4的特征,比如通过annotate的方式来识别子类的新特征,没不能实现@beforeclass,@afterclass等特征。只能通过写setup和teardown,以及test开头的测试用例的方式进行测试case书写。
2、有些button没有string,没有text,只能通过index来click这样很不直观,而且button的index并不是固定的,有可能随着 控件重新加载,顺序也有可能发生变化,无法保证测试结果。查看了robotium源码,发现大多数click方法最终都是通过传入参数转成view,再调 用clickOnView,于是参照着写了一个通过button的ID来click的方法。Button的ID需要查看测试对象的源码中获取。比如导航中 就有菜单栏大多数据button就是这种类型的。
3、有的activity点击后不能获取焦点,可以通过另外的方式获取activity的内容,比如Activity act = solo.getCurrentActivity();获取当前的activity,然后通过act.findViewById的方式获取控件。
4、多个屏幕的情况,可以通过滚屏的方式滑动,solo.scrollToSide(Solo.LEFT),如果多屏属于一个activity,则不需要滑动也能运行case获取数据。
5、有时text view或者button的click方法会失效,咋办?答案是在被测程序的AndroidManifest.xml文件里加上这么一句:<supports-screens android:anyDensity="true"/>就行了。唉,当时为了找到这个解决方法可浪费了俺不少时间啊,最后在官网上找到答案了。

6、如果要想在robotium的测试程序里读写SD card肿么办?答案是在被测程序的AndroidManifest.xml文件里加上<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>。注意是在被测程序里加上,在测试程序本身的manifest文件里加会很坑爹的。
7、listview动态添加item如何判断添加成功。可从添加前及添加后Item个 数判断,先确定添加item的属性,再通过相应的方法获取item。比如添加一个item可能需要三个textview,那么通过 getCurrentTextViews(View)前后获取到的个数差就相差三个。比如添加黑名单到黑名单列表。
(1)有的listView只有web,或者主要是文本,可以通过getItemAtPosition(i).toString()的方法获取第几行的内容。
solo.clickOnText(chooseProvPage.getListView().getItemAtPosition(i).toString());
(2)有的listView包含多个testView或者button,可以通过findViewById的方法得到某一行的一项的内容。
8、无法捕获Toast,这个有点不明白。大概实验了一下,可以使用waitForText这个函数来捕获文字,这个方法返回值是布尔型的,所以返回true就是找到了。
9、结果判断
(1)waitForText
    该方法适用于点击操作后需要一点时间才返回结果的结果判断。比如联网操作,可以设置适当的延时,等待返回结果,判断结果更加正确。
(2)assertActivity
    该方法适用于activity时,可以判断点击操作切换Activity是否正确,可以与waitfortext配合使用。
(3)searchText+assert
    当有editText时,输入内容后,可通过searchText查找输入内容是否是预期结果,再将返回结果判断。
注:有些editText的内容无法通过searchText,原因暂时没找到。比如:手动添加黑名单时的名称及号码的输入框。

八、 Robotium 项目的运行:
  有两种方式,一种是通过eclipse;一种是通过命令行。

1、 eclipse
    Run as Android JUnit Test,可以跑整个测试工程,也可以跑单个测试用例。

2、命令行
adb install ****Test.apk
adb shell am instrument testpackagename/android.test.InstrumentationTestRunner

 

 

///部分方法说明//

获取控件;如 getCurrentActivity()getEditText(String text)

l输入操作;如 enterText(EditTexteditText, String text)
l控件操作;如 clickOnText(String text)
l模拟操作;如 scrollDown()
l结果判断;如 assertCurrentActivity(String, String)
l按键模拟;如 sendKey(int key)
l控件状态检查;如 isRadioButtonChecked(String text)
l搜索操作;如;searchText(String);
l时间控制;如;sleep(int time) waitForActivity(String , int )

 


 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值