테스트 단위 테스트 / UI 테스트 / 인수 테스트 / 그 밖의 테스트
unit test 클래스 단위로 테스트
github.com/junit-team/junit/wiki/Getting-started
mockito.org mockito를 이용한 객체의 목화
testImplementation 'junit:junit:4.12'
testImplementation "org.mockito:mockito-core:1.+"
build.gradle android 내의 testOptions{ unitTests.returnDefaultValues = true }
유닛테스트 예외 던지지 않도록

mock(클래스) / spy(생성) / verify(객체, times(횟수)).함수명((클래스)any());
when(객체.함수).thenReturn(밸류); 호출했을 때 밸류를 넘긴다
아래는 기존 클래스 처리하지 않기 위해
doReturn(밸류).when(객체).함수(밸류);
doNothing().when(객체).함수(밸류);

@VisibleForTest 기능없지만 테스트용이라고 표시

Factory, InjectMock, DI 컨테이너 등 고려

테스트 도입시 코드를 새로 작성 or 기존 코드 편집시 테스트 준비
메서드가 길면 분리 / 리팩터링 리팩터->익스트랙트->메서드

테스트를 위해 메서드내 객체는 인수화
블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

그래들 빌드 스크립트 자바와 유사한 그루비 언어로 기술

module 의 build.gradle

implementation fileTree(dir: 'libs', include: ['*.jar']) //libs 디렉토리의 모든 jar 로드


settings.gradle

include ':app', ':lib' 여러 개의 모듈 사용가능


proguard 난독화 app/proguard-rules.pro

한앱에서 메서드 수가 65536개를 넘으면 mutidex 기능 이용(프로가드로 해결가능)

디버그에 문제없으나 릴리즈에 문제 있으면 프로가드 설정 의심


gradle.properties build.gradle에서 참조 가능 변수 사용가능


local.properties sdk 위치 지정 gitignore할것


의존관계 프로젝트 build.gradle에 추가하여 설정가능 gradlew build로 실행

task build << {
    println '실행'
}
task configure << {
    println '설정'
}
build.dependsOn(configure); //빌드하기 전에 설정부터 한다

keystore파일의 위치와 패스워드 등 설정(app android 내에)

signingConfigs {
        release{
            storeFile file("release.keystore")
            storePassword "xxxxxxx"
            keyAlias "androidreleasekey"
            keyPassword "xxxxxxxx"
        }
    }

//효율적인 버전관리
def versionMajor = 1
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0

versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
versionName "${versionMajor}.${versionMinor}.${versionPatch}"

빌드타입 release debug Stage


signingCongif signingCongif.release //사이닝키 설정

minifyEnabled true //프로가드 활성화

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


applicationIdSuffix ".debug" 패키지 이름 끝에 .debug 추가

versionNameSuffix "-debug" 버전 이름 끝에 -debug 추가


initWith(buildTypes.debug) 디버그 설정을 이용해 빌드타입 만들기

applicationIdSuffix ".stage"


빌드타입 확인 뷰->툴 윈도우->빌트 버라이언츠

debuggable 디버그 가능 여부

jniDebuggable 네이티브 코드 디버그 가능 여부

manifestPlaceholders 매니페스트 내에서 플레이스 홀더 설정

multiDexEnabled 멀티덱스 활성화

shrinkResources 사용하지 않는 리소스 삭제


빌드타입별로 리소스 클래스 대체 가능


프로덕트 플레이버(구현 자체를 바꾸거나 별도의 apk 생성 : 유무료 버전)


applicationId 어플리케이션 ID

Dimension 여러 프로덕트 플레이버 apk 생성 가능

generatedDensities vector drawable에서 생성되는 이미지 화면 밀도 지정

manifestPlaceholders , multiDexEnabled , proguardFiles , signingConfig

testApplicationId 테스트용 어플리케이션 ID

versionCode , versionName 

android 내에 productFlavors{ pro{} free{} }


프로덕트 플레이버와 빌드타입 혼합가능 3*2=6


gradlew assembleDebug , assembleRelease 프로젝트/app/build/에 apk생성


buildConfigField "boolean", "ENABLE_DEBUG_TOOLS", "false" 디펄트컨픽에 추가

debug에만 true로 하면 디버그시에만 디버그 툴 사용


gradlew assembleDebug(assDeb) --debug --stacktrace


build.gradle에 

if(hasProperty("myparameter")){
println "My Parameter: "+myparameter
}

gradlew assembleDebug -Pmyparameter=test

My Parameter : test


gradlew androidDependencies 의존관계 확인

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

mvp model view presenter 프리젠터가 모델과 뷰 사이에서 인터랙션한다.

뷰와 프리젠터는 contract 내의 view와 model 인터페이스를 각각 구현해 인터랙션


mvvm model view viewmodel 

observablefield livedata 데이터바인딩과 사용하여 xml에서 뷰표시

아래 두줄은 블로거가 작성한 내용이다.

사용시 livedata는 데이터 표현 용으로는 적합했지만 이벤트 처리에는 좋지 않았다.

이벤트 처리 등에는 contract 인터페이스를 뷰에서 구현해 처리하는 것이 좋겠다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,