Articles of unit testing

在finish()之后从活动中获得结果; 在Androidunit testing中

我目前正在编写一些Androidunit testing,虽然我已经按照我想要的方式完成了大部分工作,但有一件事让我有点难过。 我在测试的活动中有以下代码: Intent result = new Intent(); result.putExtra(“test”, testinput.getText().toString()); setResult(Activity.RESULT_OK, result); finish(); 我试图弄清楚如何使用Instrumentation(或其他)来读取活动的结果,或者在活动结束后获得意图。 有人可以帮忙吗?

如何在Android Robolectric测试中强制配置更改?

我正在使用robolectric使我的androidunit testing足够快有用。 我想测试我编写的代码,同时屏幕方向正在改变,以模拟一个常见的真实世界用例。 具体来说,我正在测试的是对服务器的异步http调用,在获取结果后解析了一些xml。 我对所有工作得很好的unit testing,但无法弄清楚如何模拟屏幕旋转。 任何导致活动重新创建的状态更改都很好,它不一定是屏幕旋转。 使用模拟器的解决方案不是一个选项,因为我每分钟运行几次测试,它们必须在2秒内运行。 如果可能的话,我也希望这能与roboguice合作。 谢谢。

Android上的图书馆项目的独立测试项目

我的问题是: 如何为Android库创建Android 独立测试项目? 我有我的Android 库 (在项目设置中标记为“Library”)和一个包含我的JUnit测试类的Android项目。 测试项目正确引用了Android库(在“Android”下的项目设置中)。 我的库源代码位于com.mayastudios包中。 我的所有测试用例也都位于同一个包中(但在不同的项目中)。 所以基本上我有这样的事情: +- MyLibraryProject +- src +- com/mayastudios/MyClass.java +- AndroidManifest.xml +- … +- MyTestProject (references MyLibraryProject) +- test +- com/mayastudios/MyClassTests.java +- AndroidManifest.xml +- … 这是测试项目的Android清单: 但是,当我运行测试项目时(来自Eclipse with ADT,使用“Run As – > Android JUnit Test”),我收到以下错误: Unable to find instrumentation target package: com.mayastudios 这是完整的控制台日志: [2012-04-24 17:24:20 – spatialite-test] Android […]

Androidunit testing:如何清除SharedPreferences

我试图清除在测试期间添加的所有SharedPreferences。 我已经阅读了一些post和官方文档( SharedPreferences.Editor.clear() )。 但是当我运行unit testing后启动应用程序时,我仍然find了测试值。 所以,在AndroidTestCase.tearDown()中 ,我这样做: public class PrivateStorageUtilsTest extends AndroidTestCase { private static final String KEY_SP_PACKAGE = “PrivateStorageUtilsTest”; protected void setUp() throws Exception { super.setUp(); // Clear everything in the SharedPreferences SharedPreferences sharedPreferences = getContext() .getSharedPreferences(KEY_SP_PACKAGE, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); editor.commit(); } protected void tearDown() throws Exception { // Clear […]

在Android Studio的unit testingfunction中获取AndroidTestCase或InstrumentationTestCase中的上下文

我使用Android Studio 1.1.0的新unit testing支持function运行了一些旧的测试。 运行gradlew testDebug时,运行测试,但所有需要Context的测试都会失败,因为getContext ( getInstrumentation.getContext() )/ getInstrumentation.getContext() (InstrumentationTestCase)都返回null。 我怎么解决这个问题? 这是我尝试的两种变体: import android.content.Context; import android.test.InstrumentationTestCase; public class TestTest extends InstrumentationTestCase { Context context; public void setUp() throws Exception { super.setUp(); context = getInstrumentation().getContext(); assertNotNull(context); } public void testSomething() { assertEquals(false, true); } } 和 import android.content.Context; import android.test.AndroidTestCase; public class TestTest extends AndroidTestCase […]

如何防止ActivityUnitTestCase调用Application.onCreate?

我必须在这里遗漏一些东西。 ActivityUnitTestCase的JavaDoc建议此测试用例在与系统隔离的情况下测试Activity: 此类提供单个活动的独立测试。 将使用与系统基础结构的最小连接来创建测试中的活动,并且可以注入许多Activity的依赖项的模拟或包装版本。 我假设包括没有实际启动应用程序。 此外,它公开了一个setApplication助手,可以用来注入模拟应用程序。 但是,任何ActivityUnitTestCase我都会启动(实际)应用程序并调用其onCreate方法。 更准确地说, InstrumentationTestRunner似乎正在这样做,甚至在我有机会在我的测试的setUp方法中设置应用程序之前就这样做了! 我甚至没有注意到这一点,因为它似乎发生在测试套件启动期间甚至没有达到Eclipse断点的地方,但写入onCreate的日志显示它实际上被调用。 这完全超出了我的范围。 当Android的测试运行器实例化并执行实际应用程序时,为什么我要使用模拟应用程序对象? 考虑到检测运行器在其自己的线程中运行,并且在执行此操作时生成主应用程序线程,这甚至更成问题。 这意味着正在执行的测试与调用Application.onCreate之间存在竞争条件。 如果您在那里做任何可能影响测试的事情,例如写入共享偏好文件,那么您就完全搞砸了,因为您的测试会随机失败。 我错过了什么,或者这只是测试框架中的严重疏忽? 更新这似乎也影响ApplicationTestCase 。 在我的测试用例开始之前,我可以在我的应用程序类’ onCreate一个断点。 我们在那里启动了一个即发即弃的AsyncTask,它将随机失败,因为我没有机会模拟它(记住,那是在我的测试用例中调用setUp之前)。 这是我在onCreate这个模糊的调用过程中看到的堆栈跟踪: Thread [ main] (Suspended (breakpoint at line 86 in QypeRadar)) QypeRadar.onCreate() line: 86 InstrumentationTestRunner(Instrumentation).callApplicationOnCreate(Application) line: 969 ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4244 ActivityThread.access$3000(ActivityThread, ActivityThread$AppBindData) line: 125 ActivityThread$H.handleMessage(Message) line: 2071 ActivityThread$H(Handler).dispatchMessage(Message) line: 99 Looper.loop() line: 123 ActivityThread.main(String[]) […]

如何在Android中模拟PreferenceManager?

我编写了一个使用Context ,第三方库和PreferenceManager SharedPreferences 。 可以模拟Context ,第三方库可以使用一些模拟框架进行模拟,但是如何处理PreferenceManager ? 我有两种方法: public void saveString(ThirdPartyObject obj) { SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); SharedPreferences.Editor editor = appPreferences.edit(); editor.putString(mContext.getString( R.string.preferences_string_name), obj.getString()); editor.commit(); } 和相应的,加载首选项。

访问android测试项目中的资源

我已经设置了一个运行junit测试的android测试项目。 它正在使用两个eclipse项目“Application”和“ApplicationTest”,我的测试在“ApplicationTest”项目中。 在我的一个测试中,我需要访问一个文件,如果我将文件放在SD卡上并将一个File对象指向它,这可以正常工作。 但是我想将该文件作为资源访问,但这似乎不起作用。 这就是我做的: 将文件保存在ApplicationTest/res/raw/myfile.xml 试图使用它: InputStream is = getContext().getResources().openRawResource(R.raw.myfile); 但这给了我这个例外: android.content.res.Resources $ NotFoundException:文件Hello World,HelloAndroidActivity! 来自可绘制资源ID#0x7f040000 在android.content.res.Resources.openRawResource(Resources.java:823) 在android.content.res.Resources.openRawResource(Resources.java:799) 在com.quizzer.test.QuestionHandlerTests.testImportQuestions(Tests.java:182) at java.lang.reflect.Method.invokeNative(Native Method) 在android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 在android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 在android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 在android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1448) 引起:java.io.FileNotFoundException:Hello World,HelloAndroidActivity! 在android.content.res.AssetManager.openNonAssetNative(本机方法) 在android.content.res.AssetManager.openNonAsset(AssetManager.java:406) 在android.content.res.Resources.openRawResource(Resources.java:820) ……还有14个 我的测试类扩展了AndroidTestCase,这就是上下文的来源。 更新: 所以问题似乎是在编译期间使用了测试项目中的资源,但是在运行时使用了主项目中的资源。 我还不确定如何解决这个问题。 因此,目前只有在测试项目和主项目中都使用相同的原始资源才有效,这当然是非常愚蠢的。

使用Firebase进行unit testing

我正在构建一个Android应用程序,它使用Firebase作为后端和模型,视图,演示者架构。 但是,Firebase是一项云服务这一事实使我的Android应用程序中的自动化测试变得复杂。 到目前为止,我已经构建了大部分身份validation系统,但我无法看到如何在我的应用中为Firebase代码实现unit testing。 在端到端测试方面,我也陷入困境。 由于测试是任何Android应用程序的基础,没有它应用程序开发人员无法确定他们已实现的function是否按预期运行,如果没有自动化测试,我无法真正进步。 总之,我的问题是: 通常,如何在Android应用程序中实现Firebase自动化测试? 编辑: 作为一个例子,有人可以单独测试以下方法吗? public void addUser(final String name, final String birthday, final String email, final String password) { Firebase mUsersNode = Constants.mRef.child(“users”); final Firebase mSingleUser = mUsersNode.child(name); mSingleUser.runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData mutableData) { mSingleUser.child(“birthday”).setValue(birthday); mSingleUser.child(“email”).setValue(email); mSingleUser.child(“password”).setValue(password); return Transaction.success(mutableData); } @Override public void onComplete(FirebaseError firebaseError, boolean […]

在单独的项目中创建unit testing正确的Android方法吗?

有关如何开始在Android中进行测试的说明似乎不一致: http://developer.android.com/guide/topics/testing/testing_android.html 它说: 测试项目是一个目录或Eclipse项目,您可以在其中为测试包创建源代码,清单文件和其他文件。 Android SDK包含带有ADT的Eclipse工具以及为您创建和更新测试项目的命令行。 这些工具创建用于源代码和资源的目录以及测试包的清单文件。 然而,它说: 您可以在文件系统中的任何位置创建测试项目,但最好的方法是添加测试项目,使其根目录test /与主应用程序项目的src /目录处于同一级别。 这有助于您find与应用程序关联的测试。 然后它显示了一个项目结构,其中所有测试都在您的主项目下,而不是单独的项目。 但是,如果您使用ADT插件,它将创建一个单独的项目。 哪个是正确的,或者是最佳实践 – 单独的unit testing项目,还是同一个项目?