为什么Android中的Java源代码有三个目录/文件夹?

时间:2019-07-12 15:17:36

标签: java android android-studio

我是Android开发的新手。当我创建一个新的Android Studio项目时,在java部分中生成了三个目录:

enter image description here

实际上,我们关心的是第一个目录内的java文件,在我的情况下为com.example.myapplication -> MainActivity

为什么有三个目录,每个目录都包含Java文件,并且创建这些目录是出于什么目的?

2 个答案:

答案 0 :(得分:2)

根据维基百科,开发测试是一种软件开发过程,涉及同步应用各种缺陷预防和检测策略,以降低软件开发风险,时间和成本,see

文件夹:
First com.example.myapplication)以获得实际的源代码。例如,活动,服务,广播接收者,内容提供者,模型,实用程序等的java / kotlin文件。

第二com.example.myapplication(andoridTest))适用于在Android OS上运行的instrumental testing。例如,假设我们有一个带有按钮的MainActivity。单击按钮时,将显示带有消息的吐司。因此,我们可以按以下方式测试按钮是否正常工作(为简单起见提供了导入):

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.RootMatchers.withDecorView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.not;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.withId;

@RunWith(AndroidJUnit4ClassRunner.class)
public class ExampleAndroidTest {

    @Rule
    public ActivityTestRule<Main2Activity> mActivityRule =
            new ActivityTestRule<>(Main2Activity.class);

    @Test
    public void buttonClickShowingToast_isCorrect() {
        onView(withId(R.id.bt_test)).perform(click());
        onView(withText(R.string.toast_test))
            .inRoot(withDecorView(not(
                    mActivityRule.getActivity().getWindow().getDecorView()
            ))).check(matches(isDisplayed()));
}
}

第三com.example.myapplication(test))适用于Unit tests,可以在本地计算机上运行,​​这意味着不需要Android OS。例如,我们正在创建一个计时器,并且有一个实用程序方法可将秒转换为HH:MM:SS格式。方法是:

public static String getHoursMinutesSeconds(int seconds) {
    int minutes = seconds / 60;
    seconds %= 60;
    int hours = minutes / 60;
    minutes %= 60;

    String strSec = Integer.toString(seconds);
    String strMin = Integer.toString(minutes);
    String strHour = Integer.toString(hours);
    StringBuilder sb = new StringBuilder();
    if (strHour.length() < 2) sb.append(0);
    sb.append(strHour);
    sb.append(':');
    if (strMin.length() < 2) sb.append(0);
    sb.append(strMin);
    sb.append(':');
    if (strSec.length() < 2) sb.append(0);
    sb.append(strSec);

    return sb.toString();
}

由于该方法不需要测试 Android API 。它必须在本地计算机上进行测试(因为它要快得多)。因此,单元测试代码:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

import io.jachoteam.taxiapp.views.WaitingIndicatorView;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

@RunWith(BlockJUnit4ClassRunner.class)
public class ExampleUnitTest {

    @Test
    public void getHoursMinutesSeconds_isCorrect1() {
        String actualValue = WaitingIndicatorView.getHoursMinutesSeconds(1);
        assertThat(actualValue, is(equalTo("00:00:01")));
    }

    @Test
    public void getHoursMinutesSeconds_isCorrect2() {
        String actualValue = WaitingIndicatorView.getHoursMinutesSeconds(60);
        assertThat(actualValue, is(equalTo("00:01:00")));
    }
}

每个书面代码单元的笔试是最佳实践。通过在早期阶段(当fresh =时)提供错误检测并在每次更改时都对代码进行验证,这使得在维护大型项目时,开发人员的工作变得更加轻松。

答案 1 :(得分:1)

根据Android docs

/测试: 包含用于在主机JVM上运行的本地测试的代码。

/ androidtest 仪器测试,在OS上运行。

/模块名称: 这是程序源代码所在的地方