https://github.com/whiteship/live-study/issues/4
목표
자바가 제공하는 제어문을 학습하세요.
학습할 것
선택문
반복문
과제
과제 0. JUnit 5 학습하세요.
- 인텔리J, 이클립스, VS Code에서 JUnit 5로 테스트 코드 작성하는 방법에 익숙해 질 것.
과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.
- 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
- 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
- Github 자바 라이브러리를 사용하면 편리합니다.
- 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.
과제 2. LinkedList를 구현하세요.
- LinkedList에 대해 공부하세요.
- 정수를 저장하는 ListNode 클래스를 구현하세요.
- ListNode add(ListNode head, ListNode nodeToAdd, int position)를 구현하세요.
- ListNode remove(ListNode head, int positionToRemove)를 구현하세요.
- boolean contains(ListNode head, ListNode nodeTocheck)를 구현하세요.
과제 3. Stack을 구현하세요.
- int 배열을 사용해서 정수를 저장하는 Stack을 구현하세요.
- void push(int data)를 구현하세요.
- int pop()을 구현하세요.
과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.
- ListNode head를 가지고 있는 ListNodeStack 클래스를 구현하세요.
- void push(int data)를 구현하세요.
- int pop()을 구현하세요.
(optional) 과제 5. Queue를 구현하세요.
- 배열을 사용해서 한번
- ListNode를 사용해서 한번.
선택문
if (조건){
// 조건이 참(true)이면 블록 내 코드를 실행
}
if (조건){
// 조건이 참이면 이 블록 내 코드를 실행
} else {
// 조건이 거짓(false)이면 이 블록 내 코드를 실행
}
if (조건1){
// 조건1이 참이면 블록내 코드를 실행
} else if (조건2) {
// 조건1이 거짓이고 조건2가 참이면 이 블록 내 코드를 실행
} else {
// 조건1 조건2가 모두 거짓일 경우 이 블록 내 코드를 실행
}
switch (조건 값) {
case 값1:
// 조건 값 = 값1일 때 실행하고자 하는 명령문
break;
case 값2:
// 조건 값 = 값2일 때 실행하고자 하는 명령문
break;
default:
// 조건이 어떠한 case 값에도 해당하지 않을 때
// 실행하고자 하는 명령문
break;
}
반복문
while (조건문) {
// 조건이 참일 경우 반복하고자 하는 명령문
}
do {
// do / while 문은 먼저 루프를 한 번 실행한 후 조건식을 확인
} while (조건문)
for (초기식; 조건식; 증감식) {
// 조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문
}
과제 0. JUnit 5 학습하세요.
참고: JUnit5 사용자 가이드
https://junit.org/junit5/docs/current/user-guide/JUnit 5란?
JUnit 5 = JUnit 플랫폼 + JUnit Jupiter + JUnit 빈티지
JUnit 플랫폼: JVM 위에서 프레임워크 테스트를 위한 기초역할. TestEngine Api를 제공.
JUnit 쥬피터: 테스트 작성 및 확장을 위한 새로운 프로그래밍 모델과 확장 모델의 조합. 쥬피터 베이스 테스트를 구동하기 위한 테스트엔진.
JUnit 빈티지: JUnit 3와 JUnit 4 기반 테스트 플랫폼 실행을 위한 테스트엔진.
JUnit 5은 Java 8 이상이 필요
IntelliJ 실행 → 'New Project' or 상단 메뉴에서 'File' → 'New Project'
JUnit 5 종속성(dependency) 추가를 위해 Maven이나 Gradle 선택
Gradle:
https://docs.gradle.org/current/userguide/java_testing.html#using_junit5
Maven:
https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit-platform.html
test { // JUnit 플랫폼 테스트를 위해 추가
useJUnitPlatform()
}
dependencies { // JUnit 쥬피터 종속성 추가
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
종속성을 추가하면 인텔리j에서 친절하게 Gradle 변화를 감지하고 로드할 것인지 물어본다. |
처음 시작을 위한 gradle 예시 코드
https://github.com/junit-team/junit5-samples/tree/r5.7.0/junit5-jupiter-starter-gradle
main/java → class 'Calculator' 작성
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
test/java → 테스트 코드 작성. 단축키 클래스 내에서 'Ctrl+Shift+T' 참고 영상
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class MyFirstJUnitJupiterTests {
private final Calculator calculator = new Calculator();
@Test
void addition() {
assertEquals(2, calculator.add(1, 1));
}
}
주석 (Annotations)
@Test
// 테스트 메소드임을 나타냄
@ParameterizedTest
// 파라미터화 테스트 메소드(각각 다른 arguments를 테스트)
@RepeatedTest
// 반복 테스트 템플릿
@TestFactory
// 동적 테스트를 위한 테스트 팩토리 메소드
@TestTemplate
// 등록된 providers가 반환한
@TestMethodOrder
// 주석이 달린 테스트 클래스의 테스트 메소드 실행 순서를
// 구성하기 위해 사용
@TestInstance
// 주석이 달린 테스트 클래스에서 테스트 인스턴스 수명주기를
// 구성하는데 사용
@DisplayName
// 테스트 클래스 or 테스트 메소드에 사용자 지정 이름을 선언
@DisplayNameGeneration
// 테스트 클래스에 대한 사용자 지정 이름 생성기를 선언
@BeforeEach
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 각각 메소드보다 먼저 실행되어야 함을 표시
@AfterEach
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 각각 메소드 이후에 실행되어야 함을 표시
@BeforeAll
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 모든 메소드보다 먼저 실행 되어야 함을 표시
@AfterAll
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 모든 메소드 이후에 실행 되어야 함을 표시
@Nested
// 주석이 달린 클래스가 정적이 아닌 중첩 클래스임을 나타냄
@Tag
// 메소드 or 클래스 레벨에서 테스트 필터링을 위한
// 태그 선언을 위해 사용
@Disabled
// 테스트 클래스 or 메소드를 비활성화하는 데 사용
@Timeout
// 테스트, 테스트 팩토리, 테스트 템플릿 or
// 라이프싸이클 메소드의 실행 시간 초과 실패에 사용
@ExtendWith
// 확장 선언(클래스, 매소드)등을 등록하는데 사용
@RegisterExtension
// 프로그래밍 적으로 확장성을 등록하는데 사용
@TempDir
// 라이프사이클 메소드, 테스트 메소드의 매개 변수, 필드 주입을 위한
// 임시 폴더 사용을 위해 선언
과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.
https://github.com/Sungjun-HQ/DashboardReader/tree/master/src
class DashboardReaderTest {
@Test
void getGHRepositoryTest() throws IOException {
DashboardReader dashboardReader = new DashboardReader();
// 접속한 github에서 태스트용 저장소로 이동
GHRepository repo = dashboardReader.connectGH()
.getRepository("whiteship/live-study/");
// 저장소에서 이슈 상태가 OPEN (ALL, CLOSED)
List list = repo.getIssues(GHIssueState.ALL);
// List list = repo.getIssues(GHIssueState.OPEN);
assertTrue(list.size() > 0);
Map map1 = new HashMap<>();
for (GHIssue ghIssue : list) {
GHUser user;
List commentsList = ghIssue.getComments();
if (commentsList.size() > 0) {
for (GHIssueComment comment : commentsList) {
user = comment.getUser();
// 유저의 로그인 id 가져오기
if (map1.get(user.getLogin()) == null) {
map1.put(user.getLogin(), 1);
} else {
map1.put(user.getLogin(), map1.get(user.getLogin()) + 1);
}
}
}
}
// map1 소수점 출력
for (String i : map1.keySet()) {
float progressFloat = map1.get(i);
progressFloat = progressFloat / 18 * 100;
System.out.print("name: " + i);
System.out.println(", progress: " + String.format("%.2f", progressFloat));
}
}
}
출력
Starting Gradle Daemon...
Gradle Daemon started in 1 s 264 ms
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
name: a, progress: 16.67
name: b, progress: 11.11
name: c, progress: 16.67
name: d, progress: 16.67
댓글 없음:
댓글 쓰기