Articles of unit testing

Android:unit testing服务

我目前正在尝试使用TDD编写Android应用程序。 我已经完成了编写一项在应用程序中非常重要的服务的任务。 至于这个原因,我正在尝试为服务编写适当的测试。 Android指南声明如下: “测试内容”主题列出了测试Android组件的一般注意事项。 以下是测试服务的一些具体指导原则: 确保调用onCreate()以响应Context.startService()或Context.bindService()。 同样,您应确保在响应Context.stopService(),Context.unbindService(),stopSelf()或stopSelfResult()时调用onDestroy()。 测试您的服务是否正确处理来自Context.startService()的多个调用。 只有第一个调用触发Service.onCreate(),但所有调用都会触发对Service.onStartCommand()的调用。 此外,请记住,startService()调用不会嵌套,因此对Context.stopService()或Service.stopSelf()(但不是stopSelf(int))的单个调用将停止服务。 您应该测试您的服务在正确的位置停止。 测试您的服务实现的任何业务逻辑。 业务逻辑包括检查无效值,财务和算术计算等。 来源:服务测试| Android开发者 我还没有看到对这些生命周期方法的适当测试,对Context.startService()等的多次调用。我试图解决这个问题但我现在处于亏损状态。 我正在尝试使用ServiceTestCase类测试服务: import java.util.List; import CoreManagerService; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Before; import org.junit.Test; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.content.Context; import android.content.Intent; import android.test.ServiceTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; /** * * This test should be executed on […]

线程优先级 – ‘unit testing’

一个非常简洁的问题: 如何通过简单的测试来certificate,该设置: android.os.Process.setThreadPriority(int); 实际上有效? 我发布这个问题的原因主要是通用的,因为我找不到一个可以复制的简单测试。 进一步阅读: 这对我和我的应用程序来说非常重要,因为它捕获了必须优先考虑的音频。 音频数据也被写入文件以及被分析其属性,这不太重要 – 因此我不要求这些任务“真正同时”。 在我的音频线程中,我设置: Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); 我可以通过前后检查简单地测试上面的’应用’: Process.getThreadPriority(Process.myTid()); 但是,我对测试的需求是由于文档, 其中指出 : 最重要的音频线程的标准优先级。 应用程序通常无法更改为此优先级。 尽管日志输出显示优先级已更改为-19,但我在文档中的措辞引起的担忧是,系统在执行时可能不允许正常应用程序的值为-19,并且可能保留为仅限系统应用? 如果上述情况属实,我想知道如何简单地certificate这个优先级值会发生什么 – 它是否默认为允许的最大值,还是可以完全忽略? 关于实际测试本身,我已经尝试了循环和暂停,但没有成功,我不相信我所做的尝试的结果。 我也知道这种行为是依赖于操作系统的,所以也许我无法复制一个独立的Java测试,但我没有find任何支持的例子 ? 希望有人能提供帮助。 提前致谢。 编辑 – 除了最初的答案,我很欣赏这种行为可能不是我想要或期望的。 我想要对此进行实际的物理测试 ,而不是对可能性的解释。 测试将包含多个运行不同优先级的线程以及它们在打印到日志时完成的顺序,没有比这更复杂的了。 我的尝试似乎过于复杂,因此我在这里寻求帮助。

Android Studio 3 / Kotlin代码覆盖率

我的Android应用程序是多模块项目: include (android-app/kotlin-android)’:application’, (pure kotlin)’:presentation’, (pure kotlin)’:domain’, (android-library/kotin-android)’:dataproviders’ 我正在使用Junit / Mockito进行测试,我只为kotlin android模块生成代码覆盖问题。 Android studio可以看到经过测试的行。 ui.viewmodel包中的测试类: 但是,对于纯kotlin (例如域,演示)测试覆盖率工作正常: 我正在使用Android Studio 3.0 Canary 8您可以在github上查看我的build.gradle文件: 的build.gradle dependencies.gradle application.build.gradle presentation.build.gradle android应用程序模块中的示例测试: MostPopularViewModelTest 纯kotlin模块中的示例测试: MostPopularPresenterTest 有人可以帮我解决我的问题吗? 我尝试通过Jacoco生成代码覆盖,但它也没有显示代码覆盖率。

Robolectric RoboAttributeSet – 如何使用它

我有一个自定义的android视图,具有我想测试的可设置属性。 我正在尝试使用RoboAttributeSet将这些推送到我的视图的构造函数中,但是对于我的生活来说无法find我需要用来使它们工作的正确语法。 无论我尝试什么,在robolectric测试中运行时,视图都没有拾取我正在推送的属性。 在设备或模拟器上运行应用程序很好。 有没有人可以使用这些的例子? 有谁知道如何做到这一点? 这是我的自定义视图的代码片段以及它如何使用可设置的属性。 TypedArray customProperties = aContext.getTheme().obtainStyledAttributes(aAttrs, R.styleable.LoginView, 0, 0); try { userName.setHint(customProperties.getString(R.styleable.LoginView_username_hint)); } finally { customProperties.recycle(); } 这是我的Robolectric / Spockunit testing的一个片段…… given: AttributeSet attributes = new RoboAttributeSet( [new Attribute(“com.acme:attr/username_hint”, “myhint”, “com.acme”)], Robolectric.application.resources, LoginView) when: view = new LoginView(Robolectric.application, attributes) then: view.getUsername().getHint() == “myhint” 谢谢 乔治

Androidunit testing – 代码引用android类时的最佳实践

我有一个常规的JUnit测试用例来测试非android方法逻辑。 该方法将TextUtils用于TextUtils.isEmpty()之类的东西。 我只是为了引入TextUtils类而使它成为AndroidTestCase是没有意义的。 有没有更好的方法来测试这个unit testing? 喜欢将android.jar添加到测试项目中还是什么? 与我想要模拟Context对象的另一个测试类似的情况。 我不能在没有扩展AndroidTestCase的情况下嘲笑它。 在这些情况下,我只是尝试测试非Android逻辑并且不希望它在模拟器上运行,但是它触及了一些android类的最佳实践是什么? 谢谢

使用PowerMockito尝试存根android活动类会抛出RuntimeException“Stub!”

我find了这个例子 ,他们使用PowerMock和EasyMock来存储/模拟Android的Menu和MenuItem类。 我一直在尝试使用Activity类与PowerMock和Mockito做类似的事情。 我知道很多方法都是最终的,在Android.jar中它们都只是抛出RuntimeException(“Stub!”)。 我也明白这个测试并不完整,但我只是想看看是否有可能模拟android的Activity类。 但是考虑到PowerMock允许你用最终方法模拟类,这个代码不应该工作吗? @RunWith(PowerMockRunner.class) @PrepareForTest(Activity.class) public class MyTestCase extends TestCase { public void testPlease_JustWork() throws Exception { Activity mockActivity = PowerMockito.mock(Activity.class); PowerMockito.when(mockActivity.getTitle()).thenReturn(“Title”); } } 我认为RuntimeException将不再发生,并且将返回“Title”,但它仍然会抛出exception。 我尝试了各种不同的东西,比如doReturn(“Title”).when(mockActivity).getTitle(); 和suppress(constructor(Activity.class)); 我做错了什么或这是不可能的?

有没有人使用Robotium或Calculon来测试Android应用程序?

有没有人使用Robotium或Calculon来测试Android应用程序? 它们有用吗? 有哪些建议更好?

不能使用Mockito 2模拟最终的Kotlin课程

我无法使用Mockito 2模拟Kotlin决赛课。我还在使用Robolectric。 这是我的测试代码: @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class Test { // more mocks @Mock MyKotlinLoader kotlinLoader; @Before public void setUp() { MockitoAnnotations.initMocks(this); } } 当我们尝试在setUp()方法中初始化模拟时,测试失败。 另外,我在我的代码中使用以下gradle依赖项: testCompile ‘org.robolectric:robolectric:3.3.2’ testCompile ‘org.robolectric:shadows-multidex:3.3.2’ testCompile ‘org.robolectric:shadows-support-v4:3.3.2’ testCompile(“org.powermock:powermock-api-mockito2:1.7.0”) { exclude module: ‘hamcrest-core’ exclude module: ‘objenesis’ } testCompile ‘junit:junit:4.12’ testCompile ‘org.mockito:mockito-inline:2.8.9’ 所有其他unit testing都使用此配置,但是一旦我尝试模拟Kotlin类,它就会抛出以下错误: Mockito cannot mock/spy because […]

为什么要在单独的项目而不是文件夹中进行测试?

只是出于兴趣 – 为什么决定将测试移动到一个单独的项目,而不仅仅是单独的源文件夹?

findFragmentByTag的unit testing条件

Android Studio 3.2 Canary 2 Build #AI-173.4591728, built on February 8, 2018 JRE: 1.8.0_152-release-1024-b01 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains sro Linux 4.14.18-300.fc27.x86_64 我有以下活动,我想unit testing片段已经附加的情况,并应返回非null。 并且应该落入其他条件: 这是我的活动: public class BillingActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.billing_container); if(getSupportFragmentManager().findFragmentByTag(BillingView.TAG) == null) { final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add( R.id.billing_view_container, BillingView.newInstance(), […]