본문 바로가기
Automation

App 테스트 자동화를 위한 Sample Test App 공유 (APK)

by Zeromk2 2023. 12. 5.
728x90

2023년 목표 중 하나는 바로 QA Engineer 강의를 만드는 것이였습니다.

그래서 마이크도 구매하고 실제로 동영상을 촬영하기도 하였지만

상업용으로 사용할 수 있는 어플이 없어서 강의 영상촬영을 중단할 수 밖에 없었습니다. (좋은 변명일 뿐이죠?)

반쯤 포기하고 있던 때에 그래도 유종의 미를 거둬보자 라는 생각으로

"그래 없으면 내가 만들자" 라고 생각을 했습니다. Android와 iOS 모두 필요할 수 있을 것 같아서 Flutter로 만들기로 하고

곧바로 ChatGPT와 심도 높은 대화를 나누기 시작했습니다.

제가 생각했던 App의 모습이 나오기 까지 프롬프트를 계속 수정해 나가면서 빌드하고, 다시 수정해서 빌드하고를 수차례. 

드디어 제가 원하던 모습의 테스트용 App이 완성되었습니다.



기본적인 액션인

.click()
.send_keys()

등을 사용할 수 있게 버튼과 텍스트 박스가 있도록 구성 하였습니다.

기본적인 제공 기능은 아래와 같습니다.

1. button_1을 터치하면 버튼 문구가 변경
2. 체크박스를 체크하면 우측의 문구가 변경
3. 토글 버튼 동작
4. 좌측 하단 home 버튼 터치하면 현재 화면 초기화
5. 아래로 스크롤 할 경우 button_3 버튼이 존재

 

이제 해당 App으로 동영상 촬영을 계속 이어서 할 수 있겠네요~

혹시나 사용하실 분이 계시다면 무료로 APK 파일과 소스코드를 공개하니 자유롭게 사용하셔도 됩니다.

 

app-release.apk
18.81MB

 

Flutter 코드

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int button1Count = 0;
  int button2Count = 0;
  bool checkboxValue = false;
  bool toggleValue = false;
  String button1Text = "button_1";
  TextEditingController textController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("test app for automation"),
      ),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    button1Count++;
                    button1Text = "touch!";
                  });
                },
                child: Text(button1Text),
              ),
              SizedBox(height: 30),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    button2Count++;
                  });
                },
                child: Text("button_2"),
              ),
              SizedBox(height: 30),
              Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 50),
                  child: TextField(
                    controller: textController,
                    decoration: InputDecoration(
                      hintText: "Enter text",
                    ),
                  )
              ),
              SizedBox(height: 30),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Checkbox(
                    value: checkboxValue,
                    onChanged: (value) {
                      setState(() {
                        checkboxValue = value ?? false;
                      });
                    },
                  ),
                  Text(checkboxValue ? "check" : "unchecked"),
                ],
              ),
              SizedBox(height: 30),
              Switch(
                value: toggleValue,
                onChanged: (value) {
                  setState(() {
                    toggleValue = value;
                  });
                },
              ),
              SizedBox(height: 400),
              ElevatedButton(
                onPressed: () {
                  // Handle button_3 click
                },
                child: Text("button_3"),
              ),
            ],
          ),
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            GestureDetector(
              onTap: () {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(builder: (context) => MyHomePage()),
                );
              },
              child: Text("home"),
            ),
            Text("my"),
          ],
        ),
      ),
    );
  }
}

댓글