Android单元测试使用ThreadingTest进行全新体验.docx
《Android单元测试使用ThreadingTest进行全新体验.docx》由会员分享,可在线阅读,更多相关《Android单元测试使用ThreadingTest进行全新体验.docx(17页珍藏版)》请在冰豆网上搜索。
Android单元测试使用ThreadingTest进行全新体验
1、背景
长期以来,软件测试工程师都在如何提高软件系统质量和如何提高测试效率的道路上艰难地探索,但始终没有一款性能全面的测试工具可以满足需求。
ThreadingTest(简称“TT”)智能型测试工具系列一期,是基于程序源代码的Android应用测试工具。
采取前端分析器和后端结果分析分离的技术路线,实现对多种语言的编译器级分析和多维度测试。
ThreadingTest通过一系列自动、高效、可视化技术,使软件维护与开发效率加倍、成本减半、系统软件质量提高几个数量级。
ThreadingTest采用离线分析操作,即使电脑脱离互联网也可以获得同样的体验,保障代码的安全。
2、ThreadingTestAndroidJUnitTest单元测试
ThreadingTestAndroidJUnitTest是基于AndroidJUnitTest,利用ThreadingTest本身的优势,编写的一套单元测试组件。
在原有的AndroidJUnitTest测试驱动代码的基础上,只需要进行很小的改动,就可以修改为符合ThreadingTestAndroidJUnitTest测试代码的单元测试。
除此之外,两者的测试几乎没有差别,只需要您在测试时,打开TT实时监控来接收数据,而在测试过程中,则无需其他操作,甚至感觉不到数据的收集过程。
对于传统的单元测试,在单元测试结束后,测试人员只能获得测试结果是否符合预期结果。
如果与预期结果存在差异,也无法立即得到错误原因。
当使用ThreadingTestAndroidJUnitTest进行单元测试时,还是相同的测试体验,却能够得到白盒测试的数据,当单元执行结束后,可以根据产生的数据来分析程序的出错点,使Bug的查找更快速,更准确,而为此付出最小的代价。
3、Android单元测试的编写
Android单元测试有两种方法,首先作为java程序,可以试用JUnitTest进行测试,另外也可使用AndroidJUnitTest进行单元测试。
1)、JUnitTest进行单元测试
JUnit对Android应用程序进行单元测试需要使用Java命令来启动或者在eclipse里面将启动的BootstrapEntries改为JRE,但是这种只能测试逻辑代码,因为是是运行在JVM上,而不是Android系统中,所以不能测试Android有关的代码。
使用JUnit测试的代码,需要在函数的之前加@Test,函数必须为public类型,在eclipse中,在类上右击,选择JUnitTest即可进行测试。
2)AndroidJUnitTest进行单元测试
AndroidJUnitTest单元测试是一组直接或间接继承自junit.framework.Testcase的类集合,入口是InstrumentationTestRunner。
使用AndroidJUnitTest测试,也存在两种测试方法,测试驱动与测试代码在同一工程下和测试驱动和测试代码位于不同工程,两者之间并无巨大差异,只是在测试时,前者只安装一个App,后者安装两个App。
如下为一个单元测试的实例:
步骤1:
准备好需要测试的源代码
步骤2:
添加测试类,编写测试代码
packagecalculator.xwg.test;
importjava.util.ArrayList;
importjava.util.LinkedList;
importandroid.test.ActivityInstrumentationTestCase2;
importandroid.app.AlertDialog;
importandroid.app.Instrumentation;
importandroid.widget.Button;
importandroid.widget.ListView;
importandroid.widget.TextView;
importcalculator.xwg.CalculatorMainActivity;
publicclassCalculatorMainActivityTestextends
ActivityInstrumentationTestCase2{
privateInstrumentationmInstrumentation;
privateCalculatorMainActivitymActivity;
privateTextViewmQuestionText;
privateTextViewmAnswerText;
privateButtonmCalculateButton;
privateButtonmButton1;
privateButtonmButtonPlus;
privateButtonmButtonAngle;
privateButtonmButtonDegree;
privateButtonmButtonF6;
classAssertPair{
publicAssertPair(CharSequencequest,CharSequenceres){
question=quest;
result=res;
}
booleanassertResult(){
return(question.toString().compareTo(result.toString())==0);
}
publicCharSequencequestion;
publicCharSequenceresult;
}
ArrayListassertList=newArrayList();
AssertPairmAssertPair;
FailureInfomFailureInfo;
@SuppressWarnings("deprecation")
publicCalculatorMainActivityTest(){
super("calculator.xwg",CalculatorMainActivity.class);
//TODOAuto-generatedconstructorstub
}
@Override
protectedvoidsetUp()throwsException{
super.setUp();
mInstrumentation=getInstrumentation();
setActivityInitialTouchMode(false);
mActivity=(CalculatorMainActivity)getActivity();
mQuestionText=(TextView)mActivity.findViewById(calculator.xwg.R.id.textQuestion);
mAnswerText=(TextView)mActivity.findViewById(calculator.xwg.R.id.textAnswer);
mCalculateButton=(Button)mActivity.findViewById(calculator.xwg.R.id.button74);
mButton1=(Button)mActivity.findViewById(calculator.xwg.R.id.button60);
mButtonPlus=(Button)mActivity.findViewById(calculator.xwg.R.id.button63);
mButtonAngle=(Button)mActivity.findViewById(calculator.xwg.R.id.button03);
mButtonDegree=(Button)mActivity.findViewById(calculator.xwg.R.id.button02);
mButtonF6=(Button)mActivity.findViewById(calculator.xwg.R.id.buttonF6);
mActivity.engine.clearCustomFunctions();
}//endofsetUp()methoddefinition
@Override
protectedvoidtearDown()throwsException{
mActivity.engine.clearCustomFunctions();
super.tearDown();
}
publicvoidtestPreConditions(){
//assertTrue(mSpinner.getOnItemSelectedListener()!
=null);
//assertTrue(mPlanetData!
=null);
//assertEquals(mPlanetData.getCount(),ADAPTER_COUNT);
}//endoftestPreConditions()methoddefinition
publicvoidtestCalculate(){
LinkedListcheckItemList=newLinkedList();
checkItemList.add(newAssertPair("1-2×((3+4)/58+8)×25%","-3.06034482759"));
checkItemList.add(newAssertPair("root(16,4)","2"));
checkItemList.add(newAssertPair("sin(0°)","0"));
checkItemList.add(newAssertPair("sin(30°)","0.5"));
checkItemList.add(newAssertPair("sin(390°)","0.5"));
checkItemList.add(newAssertPair("sin(-330°)","0.5"));
checkItemList.add(newAssertPair("sin(90°)","1"));
checkItemList.add(newAssertPair("sin(145°)","0.573576436351"));
checkItemList.add(newAssertPair("sin(180°)","0"));
checkItemList.add(newAssertPair("sin(200°)","-0.342020143326"));
checkItemList.add(newAssertPair("sin(270°)","-1"));
checkItemList.add(newAssertPair("sin(300°)","-0.866025403784")