问题
我有两个我要测试的Android类:
CommentContentProvider,它扩展ContentProvider并由SQLiteDatabase支持.CommentActivity,通过一个间接扩展Activity和访问.CommentContentProviderContentResolver我目前有两个测试类:
CommentContentProviderTest,扩展ProviderTestCase2<CommentContentProvider>和使用MockContentResolver.这很好用.CommentActivityTest,延伸ActivityInstrumentationTestCase2<CommentActivity>.除了CommentActivity访问的部分外,这种方法很好CommentContentProvider.问题是,当CommentActivity访问时CommentContentProvider,它通过标准这样做ContentResolver:
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver().query(...);
Run Code Online (Sandbox Code Playgroud)
因此,当CommentActivityTest运行时,它会启动CommentActivity,访问(读取和写入)生产数据库,如上面两行所示.
我的问题是如何在生产中CommentActivity使用标准ContentResolver,但MockContentResolver在测试期间.
相关问题
Activity.可能的解决方案
如果我可以通过启动的Intent注入ContentResolver(可能是a MockContentResolver或RenamingDelegatingContext),那将是很好的,但我不能这样做,因为s不是.CommentActivityContextParcelable …
android dependency-injection abstract-factory android-contentresolver android-testing
我需要使用espresso测试项目自动化我的UI测试以进行以下操作.
操作:
单击打开手机摄像头的按钮.捕获图像,并将图像保存在SD卡存储中.完成后还要在屏幕上更新小图像视图.
应用程序工作正常但是对于所有其他操作和类似的上述操作类型,一次又一次地手动测试它变得非常耗时.
android integration-testing unit-testing android-testing android-espresso
我想更多地了解ConnectedAndroidTest Gradle任务.我看到它用于安装应用程序和测试apks并运行测试.
但它的个别步骤是什么?(如果有任务,则为gradle任务)
"gradle build"似乎生成了Application apk.什么任务生成测试apk?它是如何(ConnectedAndroidTest)安装应用程序和测试apk?它是如何开始测试的?
非常感谢.
我正在使用espresso将测试添加到我的Android应用程序中.
在我看来TestActivity,我有一些只有在用户签名时才能看到的视图.该userIsSignedIn标志存储在MyApp其子类中android.app.Application.有没有办法可以访问MyApp测试用例中的实例?
如果没有,有什么方法可以做到这一点?
谢谢
我定义特定字段中BuildConfig用于获取URL运行时.因此,对于每种构建类型,我使用不同的字符串:
prod {
buildConfigField "String", "BASE_URL", "\"abc.com\""
}
debug {
buildConfigField "String", "BASE_URL", "\"efg.com\""
}
Run Code Online (Sandbox Code Playgroud)
在运行android测试时是否可以定义不同的URL?我试过把这个设置放在下面sourceSets->androidTest,但它不被接受.
android gradle android-testing android-gradle-plugin gradle-plugin
我在我的Android项目中添加了espresso测试,并在创建ActivityTestRule的行上获得了IncompatibleClassChangeError.我如何找出导致它的原因?
以下是导致错误的代码行:(HomePageScreenTest.java:27)
@Rule
public ActivityTestRule<HomePageActivity> homePageActivityTestRule = new ActivityTestRule<>(HomePageActivity.class);
Run Code Online (Sandbox Code Playgroud)
这是错误:
java.lang.IncompatibleClassChangeError: com.example.rocklee.mehmvp.HomePage.HomePageActivity
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:226)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
at dalvik.system.DexPathList.findClass(DexPathList.java:321)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.example.rocklee.mehmvp.HomePage.HomePageScreenTest.<init>(HomePageScreenTest.java:27)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) …Run Code Online (Sandbox Code Playgroud) 在IDE中直接运行单个测试时Android Studio 2.2的奇怪错误 - 我要么"没有找到测试",要么运行我之前编译的测试.
例:
@Test
fun testyTest() {
}
Run Code Online (Sandbox Code Playgroud)
我将创建此测试,并获得"未找到测试".所以我重新启动,找到了测试!显然,上述测试通过,因为它是空的.接下来,我希望我的测试失败.所以我手动抛出异常并在下面添加一行代码.
@Test
fun testyTest() {
throw RuntimeException()
}
Run Code Online (Sandbox Code Playgroud)
现在我重新编译,这个测试也通过,因为IntelliJ由于某种原因缓存了之前的测试并重新运行.要使此测试正确失败 - 我必须重新启动IDE.
有谁知道发生了什么?注意 - 我在这个项目中使用Kotlin非常重要.
编辑2:这是一个src/test/javaAndroid 库项目中的JVM测试(非android ).
编辑:这是一个完整的测试课程
package com.example.zak
import org.junit.Before
import org.junit.Test
class ExampleTest {
@Before
fun setUp() {
}
@Test
fun testyTest() {
//throw RuntimeException()
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个InstrumentedTest
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext(String groupName) {
Context appContext = InstrumentationRegistry.getTargetContext();
UiDevice device=UiDevice.getInstance(getInstrumentation());
...
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想用adb shell命令执行它.但我要传递groupName方法的参数值useAppContext(String groupName)
我正在使用命令
adb shell am instrument -w -r -e debug false -e class 'com.<package_name>.ExampleInstrumentedTest' com.<package_name>.test/android.support.test.runner.AndroidJUnitRunner
Run Code Online (Sandbox Code Playgroud)
但是如何将方法参数作为参数传递给在命令提示符下运行的命令?
在编写使用的简单测试时launchFragmentInContainer,我收到以下错误消息:
java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.myapp.appname.debug/androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }
Run Code Online (Sandbox Code Playgroud)
基本测试类是:
class OneFragmentTest {
@Test
fun testOneFragmentState_checkTitleText() {
val args = Bundle().apply {
putString("dummyKey", "dummyValue")
}
launchFragmentInContainer<OneFragment>(args)
onView(withId(R.id.tv_title)).check(matches(withText("title here")))
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试更新AndroidManifest.xml以下内容:
java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.myapp.appname.debug/androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }
Run Code Online (Sandbox Code Playgroud)
但标签似乎instrumentation有效,但值用红色书写,因此我认为targetPackageand 出了点问题name。
我如何摆脱这个错误,并在OneFragment上运行一个简单的测试launchFragmentInContainer?
嗨,我正在尝试根据以下定义的风格和自定义构建类型构建androidTest APK:
productFlavors {
FlavourOne {
applicationIdSuffix ".live"
buildConfigField 'String', 'SERVER_BASE_URL', '"http://live.com"'
}
FlavourTwo {
applicationIdSuffix ".demo"
buildConfigField 'String', 'SERVER_BASE_URL', '"http://demo.com"'
}
Run Code Online (Sandbox Code Playgroud)
}
buildTypes {
debug {
minifyEnabled false
// shrink code (remove unused classes and methods) - note that it falls back to experimental shrinker for Instant Run
shrinkResources false // don't strip unused res files
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard-rules-debug.pro'
testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-test.pro'
}
release {
minifyEnabled true // shrink code (remove unused classes and methods)
shrinkResources false // …Run Code Online (Sandbox Code Playgroud)