- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我编写过单元测试、仪器测试和 Espresso 测试。我还使用 Android Test Orchestrator 运行它们以获得清晰的应用程序状态(对于 Espresso 测试很重要)。当我从 Android Studio 运行这些测试时,一切正常。但是当我尝试使用命令行时,我收到了我无法真正理解的错误。
当我尝试时:
./gradlew connectedAndroidTest or connectedDebugAndroidTest
我收到:
Instrumentation run failed due to 'java.lang.IllegalStateException'
com.android.builder.testing.ConnectedDevice > No tests found.[SM-J106H -
6.0.1] FAILED
No tests found. This usually means that your test classes are not in the
form that your test runner expects (e.g. don't inherit from TestCase or lack
@Test annotations).
当然,我所有的测试都带有@Test 注释。
当我尝试
adb shell am instrument -w my.package/android.test.InstrumentationTestRunner
我收到了
INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for:
ComponentInfo{mypackage/myCustomRunner}
INSTRUMENTATION_STATUS_CODE: -1
我使用 CustomTestRunner,但错误保持不变。
当我尝试
adb shell 'CLASSPATH=$(pm path android.support.test.services) app_process /
\
android.support.test.services.shellexecutor.ShellMain am instrument -w -e \
targetInstrumentation
mypackage/myTestRunner \
android.support.test.orchestrator/.AndroidTestOrchestrator'
那么输出等于:
Time: 0
OK (0 tests)
有人可以向我解释我做错了什么吗?我真的不明白为什么命令行没有任何作用,但在 Android Studio 中一切都运行良好。
/编辑
我的自定义运行器:
public final class CustomTestRunner extends AndroidJUnitRunner {
private static final String TAG = "CustomTestRunner";
@Override
public void onStart() {
try {
TestListener.getInstance().testRunStarted();
} catch (Exception e) {
e.printStackTrace();
}
runOnMainSync(new Runnable() {
@Override
public void run() {
Context app = CustomTestRunner.this.getTargetContext().getApplicationContext();
CustomTestRunner.this.disableAnimations(app);
}
});
ActivityLifecycleMonitorRegistry.getInstance().addLifecycleCallback(new ActivityLifecycleCallback() {
@Override public void onActivityLifecycleChanged(Activity activity, Stage stage) {
if (stage == Stage.PRE_ON_CREATE) {
activity.getWindow().addFlags(FLAG_DISMISS_KEYGUARD | FLAG_TURN_SCREEN_ON | FLAG_KEEP_SCREEN_ON);
}
}
});
RxJavaPlugins.setIoSchedulerHandler(new Function<Scheduler, Scheduler>() {
@Override
public Scheduler apply(Scheduler scheduler) throws Exception {
return Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR);
}
});
RxJavaPlugins.setComputationSchedulerHandler(new Function<Scheduler, Scheduler>() {
@Override
public Scheduler apply(Scheduler scheduler) throws Exception {
return Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR);
}
});
RxJavaPlugins.setNewThreadSchedulerHandler(new Function<Scheduler, Scheduler>() {
@Override
public Scheduler apply(Scheduler scheduler) throws Exception {
return Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR);
}
});
super.onStart();
}
@Override
public void finish(int resultCode, Bundle results) {
try {
TestListener.getInstance().testRunFinished();
} catch (Exception e) {
e.printStackTrace();
}
super.finish(resultCode, results);
enableAnimations(getContext());
}
private void disableAnimations(Context context) {
int permStatus = context.checkCallingOrSelfPermission(Manifest.permission.SET_ANIMATION_SCALE);
if (permStatus == PackageManager.PERMISSION_GRANTED) {
setSystemAnimationsScale(0.0f);
}
}
private void enableAnimations(Context context) {
int permStatus = context.checkCallingOrSelfPermission(Manifest.permission.SET_ANIMATION_SCALE);
if (permStatus == PackageManager.PERMISSION_GRANTED) {
setSystemAnimationsScale(1.0f);
}
}
private void setSystemAnimationsScale(float animationScale) {
try {
Class<?> windowManagerStubClazz = Class.forName("android.view.IWindowManager$Stub");
Method asInterface = windowManagerStubClazz.getDeclaredMethod("asInterface", IBinder.class);
Class<?> serviceManagerClazz = Class.forName("android.os.ServiceManager");
Method getService = serviceManagerClazz.getDeclaredMethod("getService", String.class);
Class<?> windowManagerClazz = Class.forName("android.view.IWindowManager");
Method setAnimationScales = windowManagerClazz.getDeclaredMethod("setAnimationScales", float[].class);
Method getAnimationScales = windowManagerClazz.getDeclaredMethod("getAnimationScales");
IBinder windowManagerBinder = (IBinder) getService.invoke(null, "window");
Object windowManagerObj = asInterface.invoke(null, windowManagerBinder);
float[] currentScales = (float[]) getAnimationScales.invoke(windowManagerObj);
for (int i = 0; i < currentScales.length; i++) {
currentScales[i] = animationScale;
}
setAnimationScales.invoke(windowManagerObj, new Object[]{currentScales});
Log.d(TAG, "Changed permissions of animations");
} catch (Exception e) {
Log.e(TAG, "Could not change animation scale to " + animationScale + " :'(");
}
}
}
那是我的一个 Espresso 测试类(可见 RecyclerView 列表中的一个项目的 DetailView)
@RunWith(AndroidJUnit4.class)
public class DetailActivityTest {
private IdlingResource mInitialInformationIdlingResource;
@Before
public void setUp() throws UiObjectNotFoundException, InterruptedException {
SetupHelper.setUp();
File tempRealmFile = new File(InstrumentationRegistry.getTargetContext().getFilesDir(), PRODUCT_REALM_DB_FILE_NAME);
if(tempRealmFile.length() <= 8192 && CustomAssertion.doesViewExist(R.id.countries)) {
onView(withId(R.id.countries))
.check(matches(isDisplayed()));
onData(anything()).inAdapterView(withId(R.id.countries)).atPosition(3).perform(click());
mInitialInformationIdlingResource = new InitialInformationIdlingResource();
IdlingRegistry.getInstance().register(mInitialInformationIdlingResource);
Espresso.onView(withText("OK"))
.check(matches(isDisplayed()))
.perform(click());
}
}
@Test
public void ensureDetailViewWorks() throws UiObjectNotFoundException {
SetupHelper.checkForDialogs();
onView(withId(R.id.show_filter_results)).perform(scrollTo());
onView(withId(R.id.show_filter_results))
.check(matches(isDisplayed())).perform(scrollTo(), click());
onView(withId(R.id.resultList)).perform(RecyclerViewActions.actionOnItemAtPosition(1, click()));
onView(withId(R.id.main_container)).check(matches(isDisplayed()));
onView(withId(R.id.detail_item_icon)).check(matches(isDisplayed()));
}
我在 build.gradle 中的构建类型
buildTypes {
debug {
debuggable true
minifyEnabled false
versionNameSuffix "-debug"
manifestPlaceholders = [HOCKEYAPP_APP_ID: ""]
testCoverageEnabled true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
versionNameSuffix "-release"
manifestPlaceholders = [HOCKEYAPP_APP_ID: ""]
}
}
最佳答案
查看您的设备/模拟器上的日志。甚至在测试开始之前,应用程序/测试代码中的某些内容就崩溃了。 “未找到测试。这通常意味着您的测试类不是您的测试运行程序所期望的形式。”对你完全没有帮助 =)
关于android - 从 IDE 运行测试有效,但不能从命令行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50647307/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!