안드로이드에서 테스트합니다.룸 데이터베이스 테스트 @Insert

8477 단어 androidtristanjava

소개하다.

  • 현재 제 첫 번째 앱을 정식으로 발표했습니다. 구글 플레이스토어에서 찾을 수 있습니다HERE.나는 내 프로그램에 더 많은 기능을 추가하고 싶지만, 다음 가장 좋은 단계는 테스트를 추가하는 것이라고 생각한다.따라서 이 시리즈는 안드로이드 프레임워크의 테스트를 이해하는 데 주력하는 실용 시리즈가 될 것이다.
  • 소스 코드

  • 내 소스 코드를 찾을 수 있어HERE
  • 비디오 버전


    비디오 버전HERE을 찾을 수 있습니다.

    경고!

  • 업계 표준 테스트를 사용하고 비동기 코드를 만들려면 RxAndroid를 사용하십시오.그러나, 나의 코드 라이브러리는 충분히 작아서, 나는 라이브러리가 필요 없다고 믿는다.이것은 우리가 좋은 구식 병행 프로그래밍을 사용할 것임을 의미한다!!!!!
  • 스레드 및 프로세스

  • 계속하기 전에 프로그래밍의 두 가지 기본 실행 단원을 토론하고 토론해야 한다.
  • 1) 프로세스
    2) 스레드

    1) 프로세스

  • 프로세스는 자체적으로 포함된 실행 환경으로 모든 프로세스가 자신의 메모리 공간을 가지고 있다.환경에 따라 하나 이상의 프로세스가 서로 통신할 수 있습니다
  • 2) 스레드

  • 나사산은 때때로 경공예라고 불린다.루틴과 프로세스는 실행 환경을 제공하지만, 루틴을 만드는 데 필요한 자원은 새 프로세스를 만드는 데 필요한 자원보다 적습니다.Threads exist within a process and every process has at least one thread. 루틴 공유 프로세스의 자원으로 메모리를 포함한다.이는 효율적이지만 문제가 있을 수 있는 의사소통을 실현하는 데 도움이 된다.
  • Android의 프로세스 및 스레드

  • 대부분의 경우 모든 안드로이드 응용 프로그램은 자신의 리눅스 프로세스에서 실행된다(한마디 하자면 안드로이드는 리눅스를 실행한다).기본적으로 같은 프로그램의 모든 구성 요소는 같은 프로세스와 루틴을 사용합니다. 이를 '주' 루틴이라고 합니다.
  • 메인 라인

  • 애플리케이션을 시작하면 main라는 이름의 애플리케이션에 실행 스레드가 생성됩니다.주 라인은 사건을 적당한 사용자에게 분배하는 것을 책임지기 때문에 매우 중요하다.또한 Android UI 키트의 구성 요소 (작은 위젯과 보기 패키지에서 온 구성 요소) 와 응용 프로그램이 상호 작용하는 스레드입니다.현재, 메인 라인의 메인 라인을 처리할 때, 두 가지 간단한 규칙을 시종일관 따라야 한다.
  • 1) 주 스레드를 막지 마십시오
  • 2) 마스터 스레드
  • 에서 Android UI 키트에 외부로 액세스하지 마십시오.
  • 이러한 규칙을 준수하기 위해 worker threads
  • 작업 스레드

  • 응용 프로그램의 응답성을 유지하고 메인 스레드를 막지 않기 위해 단독 스레드(작업 스레드)에서 즉각 응답하지 않는 작업을 수행할 수 있도록 합니다.비트맵 디코딩, 액세스 메모리, 기계 학습 모형 처리, 네트워크 요청 실행 등 작업은 작업 라인에서 수행해야 한다.걱정하지 마십시오. 일단 우리가 작업 라인을 사용하기 시작하면, 나는 그것들을 상세하게 소개할 것입니다.
  • 테스트 데이터베이스 만들기

  • 우선, 방 데이터베이스와 DAO(데이터 접근 대상)를 설정했다고 가정합니다.없으면 설명HERE에 따라 두 설정이 완료된 후에 되돌아와 계속할 수 있습니다.
  • 이제 클래스를 생성하여 TestDatabase라고 명명합니다.
  • public class TestDatabase {
       // should be an instance of your real world database
       private volatile CalfRoomDatabase calfDatabase; 
    
    }
    
    
  • 주의volatile 키워드는 메모리 일치성 오류의 위험을 제거하는 데 사용됩니다.volatile 키워드HERE에 대한 더 많은 정보를 읽습니다.내 이름 약속CalfRoomDatabase을 무시하고 방 데이터베이스에서 이루어진 이름으로 바꿉니다.이제 배경 스레드(작업 스레드)를 계속 만듭니다
  • .

    작업 스레드 만들기


    public class TestDatabase {
       // should be an instance of your real world database
       private volatile CalfRoomDatabase calfDatabase; 
    
    private static final int NUMBER_OF_THREADS = 4;
    
    public static final ExecutorService databaseWriteExecutor =
                Executors.newFixedThreadPool(NUMBER_OF_THREADS);
    
    }
    
    
  • 보조 라인을 만드는 가장 간단하고 직접적인 방법은 라인 탱크를 통과하는 것이다. 더욱 구체적으로 말하면 통과fixed thread pool이다.고정 스레드 탱크는 특정 수량의 스레드(작업 스레드)를 포함한다.그런 다음 고정 풀에 비동기식 작업을 실행하고, 고정 풀은 작업 스레드를 사용할 수 있을 때까지 내부 대기열을 통해 작업을 저장합니다.만약 작업 라인을 사용할 수 없다면, 작업이 자유롭게 실행될 때까지 기다릴 것입니다.우리는 다음 문장으로 고정된 스레드 탱크를 만듭니다:
  • public static final ExecutorService databaseWriteExecutor =
    Executors.newFixedThreadPool(NUMBER_OF_THREADS);
  • 우리는 현재 메인 라인 이외의 라인에 접근해서 비동기적인 작업을 수행할 수 있다.
  • 메모리 데이터베이스

  • 테스트 목적ONLY으로 메모리 데이터베이스를 만들 것입니다.이러한 데이터베이스는 메모리 데이터베이스(장치)에 정보를 저장하고 프로세스가 종료되면 사라집니다.이것은 테스트가 끝날 때 데이터베이스도 멈춘다는 것을 의미한다.
  • 좋은 테스트 습관을 기르기 위해 우리는 매번 테스트를 위해 데이터베이스를 만들고 삭제할 것이다.이렇게 하면 우리는 모든 데이터베이스의 현재 상태를 알 수 있다.Dell은 Junit에서 제공하는 @After@Before 주석을 통해 이를 실현할 수 있습니다.예상한 바와 같이, Before 로 표시된 모든 방법은 테스트 전에 실행되고, @After 로 표시된 방법은 테스트 후에 실행됩니다.
  • public class TestDatabase {
       //... still include other methods
       @Before
        public void init(){
            calfDatabase = Room.inMemoryDatabaseBuilder(
                    ApplicationProvider.getApplicationContext(),
                    CalfRoomDatabase.class
            ).build();
        }
    
        @After
        public void finish(){
            calfDatabase.close();
        }
    }
    
    
  • @Before 방법은 우리가 데이터베이스를 만드는 데 필요한 모든 코드를 포함한다.이것은 매번 테스트를 하기 전에 새로운 데이터베이스를 만들 것이라는 것을 의미한다.@After 방법은 각 방법 이후에 실행되며 호출.close()을 통해 데이터베이스를 삭제합니다
  • 칼.

  • 이제 DAO(데이터 액세스 객체)에 액세스해야 합니다.이렇게 하면 DAO 작업에 액세스할 수 있으며 테스트가 필요합니다.DAO가 생성되지 않았거나 작업에 익숙하지 않은 경우 링크HERE를 사용합니다.DAO에 액세스하려면 다음 방법 중 하나만 만듭니다.
  • public class TestDatabase {
       //... still include other methods
        public CalfDao getCalfDao(){
            // getCalfDao() implemented by Room
            return calfDatabase.getCalfDao(); 
        }
    }
    
    
  • 마찬가지로 내 코드의 명칭 약정을 무시한다(내 프로그램은 젖소를 주제로 한다).당신의 코드와 나의 코드 사이의 차이는 데이터베이스 클래스의 모든 호출을 사용해서 변경해야 한다는 것입니다. calfDatabase
  • 실제 테스트!!!

  • 네, 이제 모든 세부 사항을 알고 테스트를 만들어 보겠습니다.그래서 우리가 실제로 테스트한 것은 DAO이다. 왜냐하면 이것이 바로 우리가 데이터베이스에 접근하는 방식이기 때문이다.DAOTest라는 새 클래스를 만들고 확장합니다TestDatabase.
  • public class DAOTest extends TestDatabase {
    
    }
    
  • 클래스 상속을 통해TestDatabase 클래스의 모든 내용을 방문할 수 있습니다.이런 방식을 통해 우리는 구체적인 실현을 처리하는 것을 피할 수 있다.우리가 채택한 다음 단계는 테스트 방법을 만드는 것이다.
  • public class DAOTest extends TestDatabase {
        @Test
        public void insertTest() throws Exception{
    
        }
    
    }
    
    
  • @Test 기호는 Junit에서 왔으며 이 방법은 테스트에 사용될 것임을 시스템에 나타냅니다.이것은 @Before@After 방법이 실행된다는 것을 의미한다.그리고 삽입할 테스트 대상과 성공적으로 삽입된 후에 되돌아오는 테스트 값을 만들 수 있습니다.
  • Calf calfTest1 = new Calf(1,"test-1", "TEST 1", new Date(),"Bull","test-1");
    
    int testingReturnValue = 1;
    
  • 이제 퓨처로 비동기화할 때가 됐다.Future는 비동기적인 계산 결과를 나타내는 객체입니다.계산이 완료되면 결과를 얻을 때까지 방법get()으로만 결과를 검색할 수 있습니다.
  • public class DAOTest extends TestDatabase {
        @Test
        public void insertTest() throws Exception{
    Future<Integer> calf =  CalfDatabaseTest
                    .databaseWriteExecutor.submit(new Runnable() {
                        @Override
                        public void run() {
                            getCalfDao().insert(calfTest1);
                        }
                    }, testingReturnValue); //RETURN A FUTURE OBJECT
    
                int returningCalfValue = calf.get();
        }
    
    }
    
  • 우리는Future에 정수 유형의 매개 변수를 제공했다. 왜냐하면 우리testingReturnValue는 정수이기 때문이다.다음은 고정 스레드 풀CalfDatabaseTest.databaseWriteExecutor에 액세스합니다.이것은 우리로 하여금 업무 라인에 접근할 수 있게 하고, 우리는 비동기적인 임무를 그것들에게 분배할 수 있게 한다.우리는submit 방법을 통해 작업을 만들고 Runnable .submit(new Runnable(),testingReturnValue) 을 제공합니다. Runnable에 우리가 제공한 반환값이 없기 때문입니다. testingReturnValueRunnable에서, 우리는 run 방법을 다시 쓰고, 작업 라인에서 완성하고자 하는 임무를 호출합니다.이 코드는 비동기적이기 때문에, 우리는 값을 막고 기다려야 한다.우리는 get() 방법을 사용하여 이 점을 실현한다.get() 방법은 되돌아오는 값을 얻을 때까지 막힙니다.
  • 단언

  • 마지막으로 우리는 returningCalfValuetestingReturnValue가 같다고 단언할 수 있기 때문에 삽입에 성공했다는 것을 나타낸다.
  • Assert.assertEquals(testingReturnValue,returningCalfValue);
    
  • 이것을 통해 우리는 방법 옆에 있는 녹색 작은 화살표를 클릭하여 테스트를 실행하고 테스트를 통과했는지 확인할 수 있다.

  • 결론

  • 시간을 내서 저의 이 박문을 읽어 주셔서 감사합니다.만약 어떤 문제나 걱정이 있으면, 아래에 평론을 발표하거나 저에게 연락 주십시오.
  • 좋은 웹페이지 즐겨찾기