간단한 테스트 데이터 로더를 빌드하는 방법
게시 됨: 2022-02-23소개
SQL 프로젝트는 테스트 제품군에서 그다지 인기가 없습니다. 테스트 엔지니어는 일반적으로 UI 또는 API 작업을 선호합니다. 그러나 비즈니스 로직이 관계형 데이터베이스 또는 데이터 웨어하우스에 있는 많은 프로젝트가 있으며 조만간 DB/DW에 대한 테스트를 수행해야 할 것입니다.
이러한 프로젝트에서 다른 프로젝트와 동일한 방식으로 수동 테스트는 여전히 유효한 접근 방식이며 여러 테스트 데이터 구성을 준비해야 합니다. 이는 여러 테스트 데이터 SQL 스크립트, 많은 DB 개체 및 DB 스키마로 작업할 때 고통스러울 수 있습니다. 이 기사에서는 간단한 테스트 데이터 로더를 빌드하는 방법을 보여 드리겠습니다.
사용자 인터페이스
Python과 SQL Server를 데이터 저장소로 사용할 것입니다. 먼저 데스크톱 앱을 위한 간단한 UI를 빌드해 보겠습니다. 모든 라이브러리가 이미 설치되어 있다고 가정하고 그렇지 않은 경우 "pip install [패키지]"
설정 창
수입 시스템 무작위로 가져오기 PyQt4.QtCore에서 pyqtSlot, SIGNAL, SLOT 가져오기 PyQt4.QtGui 가져오기에서 * PyQt4.QtCore에서 가져오기 * 날짜 시간 가져오기 앱 = QApplication(sys.argv) w = QWidget() w.setWindowTitle('테스트 데이터 생성기') w.resize(180, 240) w.setFixedSize(800, 460) w.setStyleSheet("배경색: 흰색;")
코드 블록 1. 설정 창 .
위젯으로 빈 창으로 시작합니다.
진행 표시 줄
이제 테스트 데이터 로더에 진행률 표시줄을 추가해 보겠습니다. 데이터 로드 또는 삭제가 끝나면 알려줍니다. 초기 값은 분명히 0으로 설정되어 있습니다.
클래스 QProgBar(QProgressBar): 값 = 0 @pyqtSlot() def 증가값(진행률 표시줄): progressBar.setValue(progressBar.value) 진행바.값 = 진행바.값+1 바 = QProgBar(w) bar.resize(320,30) bar.setValue(0) bar.move(460,400)
코드 블록 2. 진행률 표시줄 설정
코드 블록 2에는 설명해야 할 몇 가지 사항이 포함되어 있습니다.
- 값 증가 – 진행률 표시줄 값을 증가시키는 방법
- QProgBar(w) – QProgressBar 위젯은 진행률 표시줄을 제공합니다.
라벨
버튼, 드롭다운, 입력 필드 등에 대한 레이블이 필요합니다.
lName = QLabel(w) {...} lName.setText("이름") lName.move(60,60) {...}
코드 블록 3. 라벨 설정
그리고 Code Block 3에 대한 설명입니다.
- {…} – 분명히, 나는 모든 코드를 넣지 않을 것이므로 지금부터 이 {...} 를 사용하여 "여기에 코드 연속"을 알릴 것입니다.
- QLabel(w) - QLabel 위젯은 텍스트를 제공합니다.
버튼, 체크박스 및 입력 필드
액션 버튼부터 시작하여 앱의 몇 가지 요소를 더 살펴보겠습니다.
btnDelete = QPushButton('테스트 데이터 삭제', w) btnLoad = QPushButton('로드 테스트 데이터', w) {...} 스키마 = QComboBox(w) schema.addItem("스키마 테스트") schema.move(200,10) schema.resize(120,25) 데이터베이스 = QLineEdit(w) 데이터베이스.무브(30, 10) 데이터베이스.크기 조정(120,25) database.setPlaceholderText("DB 이름") name1 = QCheckBox('이름 1', w) name1.move(30, 85) name1.setChecked(참) {...}
코드 블록 4. 라벨 설정
코드 블록 4에 정의된 앱 요소는 다음과 같습니다.
- QPushButton('') – QPushButton 위젯은 버튼을 제공합니다.
- QComboBox(w) – QComboBox 위젯은 드롭다운 목록입니다.
- QLineEdit(w) – QLineEdit 위젯은 한 줄 텍스트 입력입니다.
- QCheckBox – QCheckBox 위젯은 텍스트 레이블이 있는 확인란을 제공합니다.
행위
이제 재미있는 부분이 나옵니다. 액션을 생성하고 신호를 슬롯과 연결합니다.
@pyqtSlot() def on_click_loadData(): bar.setValue(25) 이름 목록 = [] {...} db = str(데이터베이스.텍스트()) {...} if(이름1.isChecked()==참): nameList.append("이름 1") {...} if(len(이름 목록)>0): 이름 = str(nameList[randomValueGenerator(len(nameList))-1]) bar.setValue(50) if(str(schema.currentText())=='테스트 스키마'): addTestData(db, '테스트', 이름, {...}) {...} bar.setValue(75) bar.setValue(100) def on_click_deleteData(): bar.setValue(25) db = str(데이터베이스.텍스트()) bar.setValue(50) if(str(schema.currentText())=='테스트 스키마'): deleteTestData(db, '테스트') {...} bar.setValue(75) bar.setValue(100) {...} def randomValueGenerator(len): random.randint(1,len) 반환 btnStructure.clicked.connect(on_click_createStructure) btnStructure.move(20, 400) btnStructure.resize(120,30) btnLoad.clicked.connect(on_click_loadData) btnLoad.move(160, 400) btnLoad.resize(120,30) btnDelete.clicked.connect(on_click_deleteData) btnDelete.move(300, 400) btnDelete.resize(120,30) w.show() app.exec_()
코드 블록 5. 라벨 설정

꽤 긴 코드입니다. 방금 구현한 내용을 자세히 살펴보겠습니다.
- on_click_loadData() – addTestData() 함수를 호출하고
btn.clicked.connect() 함수
- on_click_deleteData() – deleteTestData() 함수를 호출하고
btn.clicked.connect() 함수
- randomValueGenerator() – 정의된 범위에서 임의의 int 값을 반환합니다.
- btn.clicked.connect() – 신호를 슬롯에 연결합니다.
- w.show() – 위젯 표시
- app.exec_() - 애플리케이션 실행
DB 작업
우리 앱에는 버튼 동작과 연결된 SQL 동작이 필요합니다. pyodbc 커넥터를 사용하여 SQL Server DB에 연결합니다. DB 스키마가 이미 존재하고 테이블 등과 같은 DB 객체를 생성할 필요가 없다고 가정합니다.
테스트 데이터 추가
addTestData 함수는 UI에서 값을 가져와 SQL 쿼리에 전달합니다. 하지만 전체 코드를 살펴보겠습니다.
- dbAddress를 정의하여 SQL Server DB에 대한 연결 열기
- id 값 설정 – 테이블 id가 자동 증분 값이 아닌 경우 사용할 id의 다음 값을 알아야 합니다.
- SQL 쿼리 정의. UI에서 몇 가지 값을 전달합니다.
pyodbc 가져오기 ConfigParser 가져오기 구성 = ConfigParser.RawConfigParser() config.read('../resources/env.properties') 목록 = [] 로그인 = 'myFancyLogin' def addTestData(db, 스키마, 이름 {...}): 노력하다: dbAddress = "드라이버={SQL 서버}; 서버=localhost\SQLEXPRESS; 데이터베이스="+db+";Trusted_Connection=예; 유;pwd=" cnx = pyodbc.connect(dbAddress) 커서 = cnx.cursor()+schema+"].[후보] ORDER BY ID DESC" id = returnValue(cnx, 커서, id) 아이디 = str(아이디 + 1) 스키마 = str(스키마) testQuery = 'SELECT DB_NAME() AS [현재 데이터베이스];' 후보자 = "INSERT INTO ["+스키마+"].[후보자] VALUES("+ID+",'"+이름+"',{...}")" returnDBName(cnx, 커서, testQuery) 목록 = [후보] executeQuery(cnx, 커서, 목록) e로 pyodbc.Error 제외: 인쇄(e) 'addTestData 함수의 오류' 인쇄 또 다른: cnx.close()
코드 블록 6. 테스트 데이터 메소드 추가
테스트 데이터 삭제
테스트 데이터의 삭제는 deleteTestData(db,schema) 함수에 의해 처리됩니다. 2개의 매개변수(db, schema)만 있습니다. 그것은 우리가 안에 있는 것을 옮기지 않고 전체 테이블을 비우고 싶다는 것을 의미합니다.
def deleteTestData(db, 스키마): 노력하다: dbAddress = "드라이버={SQL 서버}; 서버=localhost\SQLEXPRESS; 데이터베이스="+db+";Trusted_Connection=예; 유;pwd=" cnx = pyodbc.connect(dbAddress) 커서 = cnx.cursor() 스키마 = str(스키마) testQuery = 'SELECT DB_NAME() AS [현재 데이터베이스];' 후보자 = "["+스키마+"].[후보자]에서 삭제" 후보 처리 = "다음에서 삭제 ["+스키마+"].[후보 처리됨]" returnDBName(cnx, 커서, testQuery) 목록 = [후보, 후보자 처리] executeQuery(cnx, 커서, 목록) 제외하고: 'deleteTestData 함수의 오류' 인쇄 또 다른: cnx.close()
코드 블록 7. 테스트 데이터 메소드 삭제
유틸리티
그리고 addTestData() 및 deleteTestData() 함수에서 사용하는 일부 utils 함수:
def executeQuery(cnx, 커서, 목록): 목록에 있는 i의 경우: 커서.실행(i) cnx.commit() def returnDBName(cnx, 커서, dbQuery): cursor.execute(dbQuery) 값 = cursor.fetchone() 값 = 값[0] 값 = str(값)
코드 블록 8. Util 함수
EXE 파일
현재 Python이 설치되어 있고 코드를 컴파일할 수 있으면 코드를 사용할 수 있지만 실행 파일만 있으면 어떻게 될까요? py2exe 라이브러리를 사용하면 Python 코드(코드 블록 9)에서 실행 파일을 만들 수 있습니다.
distutils.core 가져오기 설정에서 py2exe 가져오기 setup(windows=[위젯이 있는 파일 이름], 데이터 파일 = 데이터 파일, 옵션={ 'py2exe': { "포함":['sip'], "dll_excludes": ['MSVFW32.dll', 'AVIFIL32.dll', 'AVICAP32.dll', 'ADVAPI32.dll', 'CRYPT32.dll', 'WLDAP32.dll', 'MSVCP90.dll'] } })
코드 블록 9. .exe 파일 생성
결과
그리고 여기 우리 작업의 결과가 있습니다. 튜토리얼을 즐겼기를 바랍니다!
