HTTP 아날로그 어댑터를 통해 HTTP 요청/응답 워크플로우를 아날로그화하여 Dart/FLUTER에서 유효한 테스트를 수행합니다.

14433 단어 darttesttestingflutter

http-mock-adapterDioMockito를 기반으로 구축된 Dart 패키지입니다.미리 정의된 어댑터를 통해 요청과 상응하는 응답을 정의하면 Dio를 통해 보내는 요청을 모의할 수 있습니다.또는 http mock adapter의 사용자 정의 어댑터에 있는 모키토를 통해 간단하게 데이터를 시뮬레이션할 수 있습니다.

문제.


http 아날로그 어댑터는 어떤 문제를 해결했습니까?
문제는 문제의 본질인 효율적인 테스트에 있다.
일반적으로 한 항목에는 여러 가지 코드가 포함될 수 있습니다.
  • 외부 서비스(네트워크, 데이터베이스)에 의존
  • 계산에 많은 시간 소요
  • 구조 내의 많은 기존 실체와 조건에 달려 있다
  • 사전 정의된 모든 기능을 지원하지 않음
  • 향후 변경될 수 있음
  • 더 구체적으로 말하면 HTTP 요청을 보낸 상황에서 실제 데이터를 실제 서버에 보내고 실제 응답을 추정해야 합니까?
    네트워크 요청을 보내는 데 시간이 걸립니다.서버가 항상 부팅되고 실행될 것이라고 보장할 수도 없습니다.이 밖에 너무 많은 요청을 보내는 것도 문제가 있는데, 특히 소프트웨어의 일부분을 테스트하기 위해서다.
    http 아날로그 어댑터는 실제 서버와 상호작용하는 문제를 해결하는 데 목적을 둔다.

    솔루션


    자원 집약형 임무를 테스트하는 데 보편적으로 받아들여지는 해결 방안은 데이터 시뮬레이션이다.아날로그 데이터는 인공 데이터로 실제 절차를 모의하는 작업 흐름에 사용되며 보통 소프트웨어 테스트 계획의 일부분이다.
    문외한의 말로는 개발자/테스트원이 대상을 모의하여 대상의 구체적인 실현을 빙빙 돌려서 맞춤형 행위를 일으킨다.예를 들면 다음과 같습니다.
    응용 프로그램 등록 기능을 테스트하려는 UI를 가정해 봅시다. 전자 우편과 비밀번호가 있는 등록 양식을 제공해야 할 수도 있습니다. 등록 단추를 누르면 응용 프로그램이 사용자의 입력을 처리하고, 화면에 적당한 요소를 표시할 수 있도록 등록 과정의 결과를 기다려야 할 수도 있습니다.
    만약 응용 프로그램이 원격 서버에 연결되어 등록을 하고 많은 작은 의존항(로컬 캐시 사용자 입력, 서버에 로그 데이터 전송 등)을 포함해서 등록 요청을 서버에 성공적으로 보낼 수 있다면 어떤 문제가 발생합니까?다음과 같은 여러 가지 결과가 발생할 수 있습니다.
  • 지원되지 않는 사용자 입력 해석으로 인한 오류
  • 서버 종료로 인한 오류
  • 의존항 주입 부족으로 인한 오류
  • 테스트를 실행할 때마다 새 고유 사용자를 만들어야 함
  • 등록 성공/실패/지연
  • 으로 인해 어플리케이션 UI의 작동 여부를 테스트하는 데 필요한 시간을 초과해야 합니다.
  • 서버에 불필요한 추가 요청 및 속도 감소
  • 시뮬레이션을 사용하지 않은 테스트가 많으면 테스트를 완성하려면 오래 기다려야 한다
  • 데이터 시뮬레이션은 매우 간단한 사용을 통해 상술한 모든 문제를 해결하였다.
    실제 등록 기능을 만드는 시뮬레이션을 테스트하고 사용자 정의 데이터, HTTP 클라이언트, HTTP 요청과 응답을 정의할 수 있습니다. 논리는'새 사용자를 등록하시겠습니까? 저는 시뮬레이션 대상을 만들 것입니다. 이 대상은'성공 등록'의 인공 응답을 생성합니다!"이 특정/등록 루트에 어떤 종류의 데이터를 보내면!"
    http 아날로그 어댑터의 사용 편의성을 보여줌으로써 특정 요청에 대한 응답으로 특정한 응답을 되돌릴 수 있습니다.
    import 'package:dio/dio.dart';
    import 'package:http_mock_adapter/http_mock_adapter.dart';
    
    void main() async {
      final dio = Dio();
      final dioAdapter = DioAdapter();
    
      dio.httpClientAdapter = dioAdapter;
    
      const path = 'https://example.com';
    
      dioAdapter
          .onGet(path)
          .reply(200, {'message': 'Successfully mocked GET!'})
          .onPost(path)
          .reply(200, {'message': 'Successfully mocked POST!'});
    
      final onGetResponse = await dio.get(path);
      print(onGetResponse.data); // {"message":"Successfully mocked GET!"}
    
      final onPostResponse = await dio.post(path);
      print(onPostResponse.data); // {"message":"Successfully mocked POST!"}
    }
    
    이러한 간단한 절차를 통해 우리는 맞춤형 DioAdapter(아날로그 요청에 개발자의 우호적인 방법을 공개하는 클래스)를 사용하여 Dio(HTTP 클라이언트)가 미리 정의된 상태 코드, 데이터 등을 사용하여 https://example.com에 대한 GET와 POST 요청을 아날로그화할 수 있음을 지시할 수 있습니다!
    서버 문제가 없고 실행 속도가 매우 빠르며 사용하기 쉽다. 의존성과 세부 사항을 걱정할 필요가 없고 필요와 선호에 따라 우리가 원하는 프로그램을 어떻게 테스트하는지 제어할 수 있다.
    또는 사용자 정의 차단기를 통해 Dio 요청을 DioInterceptor 목록에 추가하여 Dio 요청을 시뮬레이션할 수 있습니다.
    import 'package:dio/dio.dart';
    import 'package:http_mock_adapter/http_mock_adapter.dart';
    
    void main() async {
      final dio = Dio();
      final dioInterceptor = DioInterceptor();
    
      dio.interceptors.add(dioInterceptor);
    
      const path = 'https://example.com';
    
      dioInterceptor
          .onDelete(path)
          .reply(200, {'message': 'Successfully mocked DELETE!'})
          .onPatch(path)
          .reply(200, {'message': 'Successfully mocked POST!'});
    
      final deleteResponse = await dio.delete(path);
      print(deleteResponse.data); // {"message":"Successfully mocked DELETE!"}
    
      final postResposne = await dio.patch(path);
      print(postResposne.data); // {"message":"Successfully mocked POST!"}
    }
    
    보상: Mockito로 남을 조롱하는 것에 익숙해지면?http 아날로그 어댑터에는 다음과 같은 아날로그 버전dio.interceptors이 포함되어 있습니다.
    import 'dart:convert';
    
    import 'package:dio/dio.dart';
    import 'package:test/test.dart';
    import 'package:http_mock_adapter/http_mock_adapter.dart';
    import 'package:mockito/mockito.dart';
    
    void main() {
      Dio dio;
      Response<dynamic> response;
    
      group('DioAdapterMockito', () {
        DioAdapterMockito dioAdapterMockito;
    
        setUpAll(() {
          dio = Dio();
    
          dioAdapterMockito = DioAdapterMockito();
    
          dio.httpClientAdapter = dioAdapterMockito;
        });
    
        test('mocks any request/response via fetch method', () async {
          final responsePayload = jsonEncode({'response_code': '200'});
    
          final responseBody = ResponseBody.fromString(
            responsePayload,
            200,
            headers: {
              Headers.contentTypeHeader: [Headers.jsonContentType],
            },
          );
    
          final expected = {'response_code': '200'};
    
          when(dioAdapterMockito.fetch(any, any, any))
              .thenAnswer((_) async => responseBody);
    
          response = await dio.get('/route');
    
          expect(expected, response.data);
        });
      });
    }
    

    패키지 정보


    이 패키지는 수요에 따라 개발되고 있다Lomsa.HTTP 요청을 쉽게 모의할 수 있는Dart 패키지를 찾을 수 없어서 만들기로 했습니다.
    패키지가 Dio 요청을 시뮬레이션할 수 있는 상태에 도달했습니다.우리는 계속 그것을 개발하고 추가 기능, 빈 안전성, 깨끗하고 사용하기 쉬운 API, 최적화된 코드, 기타 HTTP 클라이언트와의 통합 등을 통해 더욱 잘 사용할 계획입니다!

    결어


    데이터 시뮬레이션은 매우 중요한 개념으로 철저한 테스트를 거친 코드 라이브러리를 가지고 소프트웨어가 가능한 한 잘 작동하도록 하려는 개발자에게 매우 유용하다.
    우리는 네가 http-mock-adapter에게 기회를 주기를 바란다.하면, 만약, 만약...👍 만약 오류가 발생하거나 아주 좋은 기능을 생각해서 패키지를 개선할 수 있다면 메시지를 발표하고 issues' section를 통해 저희에게 연락하세요!

    좋은 웹페이지 즐겨찾기