시스템 운영
우리는 모든 조각 자체 테스트 개별 마이크로 서비스를 전에, 다음, 우리는 모든 서비스 모듈 FBI 테스트를 필요로하기 때문에 긴 코딩 후, 우리의 주요 모듈이 실질적으로 완료, 현실을하자.
클리어 테스트 데이터 및 테스트 파일
우리는 다양한 서비스를 구현하는 과정에서, 결과의 우리의 궁극적 인 표시에 영향을 미치지 않도록 테스트 파일 및 테스트 많은 양의 데이터를 추가, 우리는 먼저 기록 데이터 이전에 정리합니다.
drop database advertisement;
우리는 여전히 테스트 데이터를 추가 이동 경로를 사용합니다 :
INSERT INTO `ad_user` VALUES (10,'Isaac','B2E56F2420D73FEC125D2D51641C5713',1,'2019-08-14 20:29:01','2019-08-14 20:29:01');
INSERT INTO `ad_creative` VALUES (10,'第一个创意',1,1,720,1080,1024,0,1,10,'https://www.life-runner.com','2019-08-14 21:31:31','2019-08-14 21:31:31');
INSERT INTO `ad_plan` VALUES (10,10,'推广计划名称',1,'2019-11-28 00:00:00','2019-11-20 00:00:00','2019-11-19 20:42:27','2019-08-14 20:57:12');
INSERT INTO `ad_unit` VALUES (10,10,'第一个推广单元',1,1,10000000,'2019-11-20 11:43:26','2019-11-20 11:43:26'),(12,10,'第二个推广单元',1,1,15000000,'2019-01-01 00:00:00','2019-01-01 00:00:00');
INSERT INTO `ad_unit_district` VALUES (10,10,'陕西省','西安市'),(11,10,'陕西省','西安市'),(12,10,'陕西省','西安市'),(14,10,'山西省','阳泉市');
INSERT INTO `ad_unit_hobby` VALUES (10,10,'爬山'),(11,10,'读书'),(12,10,'写代码');
INSERT INTO `ad_unit_keyword` VALUES (10,10,'汽车'),(11,10,'火车'),(12,10,'飞机');
INSERT INTO `relationship_creative_unit` VALUES (10,10,10);
수출 테스트 인덱스 파일
참조 인덱스 포털의 전체 양의 소스 코드 또는 다운로드, GitHub의 포털 / gitee 포털을 실행 mscx-ad-db
후 실행 프로젝트를하고, // 로컬 호스트 : 7002 / AD-dB / 수출 / 계획을 HTTP를 .
자체 테스트 단위 테스트 개발
자격을 갖춘 개발자는 절대적으로 참을 수없는 자신의 코드가 바보 X의 버그가 존재하지만, 항상 개인이 실수있을 것입니다 존재이다, 그래서 우리는 기본적인 문제가 그와 같은 비 서비스 개발,이 시간, UT의 개발을 방지하는 방법에있다 그것은 매우 중요하다.
광고 전달 시스템 테스트
아래 그림과 같이 우리는 전달 시스템의 단위 테스트를 준비해야한다 :
우리의 공식 프로젝트 구조 일관성있는 전문화 구성과 단위 테스트 모듈의 디렉토리 구조를 당신이 작성하는 단위 테스트를해야하는 경우, 우리의 application.yml
그것에 UT에 구성 파일 복사 여기를 반복하지 않습니다.
고객 서비스 단위 테스트
@RunWith(SpringRunner.class) @SpringBootTest( classes = {SponsorApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.NONE ) public class UserServiceTest { @Autowired private IUserService userService; @Test // @Transactional public void testCreateUser() throws AdException { UserRequestVO userRequestVO = new UserRequestVO("Isaac Zhang"); UserResponseVO responseVO = userService.createUser(userRequestVO); assert responseVO.getUserName() == "Isaac Zhang"; System.out.printf("创建用户: %s", JSON.toJSONString(responseVO)); } }
우리는 두 지점에 특별한주의를 지불, 위의 코드에서, 우리는 사용자의 서비스를 만들 수있는 방법을 테스트 볼 수 있습니다 :
@Transactional
참고.
우리가 동일한 데이터베이스 및 정식 서비스를 사용하고 있기 때문에, 우리가 실시간 테스트에서 사용자를 삽입합니다ad_user
우리는 테이블에 사용자를하지 않으려면, 테이블, 당신은 추가 할 필요가@Transactional
주석을, 우리가 만듭니다 커밋되지 않습니다, 그것은 실제 데이터베이스에 삽입되지 않습니다.@SpringBootTest
참고
classes
, 어떤 테스트 시작 클래스 표시webEnvironment = SpringBootTest.WebEnvironment.NONE
현재의 테스트는 웹 환경 아니라는 것을 보여줍니다.
다음은 각 서비스에 대한 단위 테스트를 작성하여야한다, 그러나 우리는 실제 세계에서 기업의 개발 환경, 코드 커버리지 대규모 개발 팀은 확실히, 단위 테스트 요구 사항이 일반적으로 낮은 수없는 것을 기억해야한다 에 60%
개인적으로 소유하는 것은, 行代码覆盖率
우리의 진정한 모든 방법을 수행하고 검증을 시도하는 것을 보장하기 위해> 80 %이다.
우리는 그것을 테스트하기 위해 단위의 나머지 부분을 달성하려고합니다.
광고 검색 시스템 테스트
우리의 검색 서비스는 외부에만 서비스를 제공, 그래서 우리는 단지 그것을 테스트 클래스를 생성 코드의를 할 필요가있다.
package com.sxzhongf.ad.search;
import com.sxzhongf.ad.AdSearchApplication;
import com.sxzhongf.ad.search.vo.SearchRequest;
import com.sxzhongf.ad.search.vo.SearchResponse;
import com.sxzhongf.ad.search.vo.feature.DistrictFeature;
import com.sxzhongf.ad.search.vo.feature.FeatureRelation;
import com.sxzhongf.ad.search.vo.feature.HobbyFeatrue;
import com.sxzhongf.ad.search.vo.feature.KeywordFeature;
import com.sxzhongf.ad.search.vo.media.AdSlot;
import com.sxzhongf.ad.search.vo.media.App;
import com.sxzhongf.ad.search.vo.media.Device;
import com.sxzhongf.ad.search.vo.media.Geo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* SearchTest for 搜索服务测试用例
*
* @author <a href="mailto:[email protected]">Isaac.Zhang | 若初</a>
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdSearchApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class SearchTest {
@Autowired
private ISearch search;
@Test
public void testFetchAds() {
SearchRequest request = new SearchRequest().builder()
.mediaId("isaac-search-mediaId")
.requestInfo(new SearchRequest.RequestInfo(
"request id",
Arrays.asList(
new AdSlot().builder()
.adSlotCode("slot code")
.height(800)
.minCpm(1024)
.positionType(1)
.type(Arrays.asList(1))
.build()
),
buildSimpleApp(),
buildSimpleGeo(),
buildSimpleDevice()
))
.featureInfo(
buildSimpleFeatureInfo(
Arrays.asList("汽车", "火车", "飞机"),
Collections.singletonList(
new DistrictFeature.ProvinceAndCity(
"陕西省", "西安市"
)
),
Arrays.asList("爬山", "写代码", "飞机"),
FeatureRelation.OR
)
)
.build();
SearchResponse response = search.fetchAds(request);
// assert response.adSlotRelationAds.get(0).contains("key");
System.out.println("开始查询广告拉:" + response);
}
/**
* 创建demo {@link App}
*/
private App buildSimpleApp() {
return new App().builder()
.activityName("simple App activityName")
.appCode("simple App appCode")
.appName("simple app name")
.packageName("simple app package name")
.build();
}
/**
* 创建demo {@link Geo}
*/
private Geo buildSimpleGeo() {
return new Geo().builder()
.longitude(Float.valueOf("100.2222222"))
.latitude(Float.valueOf("38.8888888"))
.city("xiaan")
.province("shaanxi")
.build();
}
/**
* 创建demo {@link Device}
*/
private Device buildSimpleDevice() {
return new Device().builder()
.deviceCode("simple device code")
.deviceMacAddr("simple mac addr")
.displaySize("simple display size")
.ip("127.0.0.1")
.model("simple model")
.screenSize("simple screen size")
.serialName("simple serial name")
.build();
}
private SearchRequest.FeatureInfo buildSimpleFeatureInfo(
List<String> keywords,
List<DistrictFeature.ProvinceAndCity> provinceAndCities,
List<String> hobbys,
FeatureRelation featureRelation
) {
return new SearchRequest.FeatureInfo(
new KeywordFeature(keywords),
new DistrictFeature(provinceAndCities),
new HobbyFeatrue(hobbys),
featureRelation
);
}
}
이 테스트의 경우, 복잡성은 매우 몸의 중심을 이해할 필요가있을 때 검색 기준의 다양한 우리의 주요 구성 요소, 우리는이 사업에 파트너가 필요하다.