1- import os
2- import pytest
3- import random
4- import datetime
5- from faker import Faker
6- from peewee import *
7- from playhouse .db_url import connect
8- from data_watchtower import (DbServices , Watchtower , DatabaseLoader ,
9- ExpectRowCountToBeBetween , ExpectColumnValuesToNotBeNull )
10-
11- dw_test_data_db_url = os .getenv ('DW_TEST_DATA_DB_URL' , 'sqlite:///test.db' )
12- dw_backend_db_url = os .getenv ('DW_BACKEND_DB_URL' , "sqlite:///data.db" )
13- NUM_OF_STUDENTS = 20
14- NUM_OF_DAY = 10
15-
16- database_proxy = DatabaseProxy ()
17-
18-
19- class BaseModel (Model ):
20- class Meta :
21- database = database_proxy
22-
23-
24- class Student (BaseModel ):
25- name = CharField ()
26- age = IntegerField ()
27-
28-
29- class Score (BaseModel ):
30- name = CharField ()
31- date = DateField ()
32- chinese = IntegerField (null = True )
33- english = IntegerField (null = True )
34- math = IntegerField (null = True )
35-
36-
37- def setup_module ():
38- # print("初始化数据")
39- database = connect (dw_test_data_db_url )
40- database_proxy .initialize (database )
41- with database :
42- database .drop_tables ([Student , Score ])
43- database .create_tables ([Student , Score ])
44-
45- fake = Faker (locale = 'zh_CN' )
46- students = []
47- for i in range (NUM_OF_STUDENTS ):
48- student = Student .create (name = fake .unique .name (), age = fake .random_int (min = 10 , max = 18 ))
49- students .append (student )
50- days = []
51- for i in range (NUM_OF_DAY ):
52- date = (datetime .datetime .now () - datetime .timedelta (i )).date ()
53- days .append (date )
54- random .shuffle (students )
55- for j , student in enumerate (students ):
56- if j == 0 :
57- # 让一个学生缺考
58- continue
59- chinese = fake .random_int (min = 0 , max = 100 )
60- english = fake .random_int (min = 0 , max = 100 )
61- math = fake .random_int (min = 0 , max = 100 )
62- if fake .random_int (min = 1 , max = 10 ) == 1 :
63- chinese = None
64- if fake .random_int (min = 1 , max = 10 ) == 1 :
65- english = None
66- if fake .random_int (min = 1 , max = 10 ) == 1 :
67- math = None
68- score = Score .create (
69- name = student .name ,
70- date = date ,
71- chinese = chinese ,
72- english = english ,
73- math = math ,
74- )
75-
76-
77- def teardown_module ():
78- # print('测试模块清理')
79- pass
80-
81-
82- @pytest .fixture
83- def custom_macro_map ():
84- return {
85- 'today' : {'impl' : lambda : datetime .datetime .today ().strftime ("%Y-%m-%d" )},
86- 'start_date' : '2024-04-01' ,
87- 'column' : 'name' ,
88- }
89-
90-
91- @pytest .fixture
92- def db_svr ():
93- return DbServices (dw_backend_db_url )
94-
95-
96- def test_demo_data ():
1+ #!/usr/bin/env python
2+ # -*- coding: utf-8 -*-
3+ """集成测试:完整流程 DataLoader → Watchtower → Validator → DbServices"""
4+ from data_watchtower import (
5+ Watchtower , DatabaseLoader ,
6+ ExpectRowCountToBeBetween , ExpectColumnValuesToNotBeNull ,
7+ )
8+ from conftest import Student , Score , NUM_OF_STUDENTS , NUM_OF_DAYS
9+
10+
11+ def test_demo_data (test_data_db ):
12+ """验证测试数据已正确生成"""
9713 assert Student .select ().count () == NUM_OF_STUDENTS
98- assert Score .select ().count () == NUM_OF_DAY * (NUM_OF_STUDENTS - 1 )
14+ assert Score .select ().count () == NUM_OF_DAYS * (NUM_OF_STUDENTS - 1 )
9915
10016
101- def test_create_table (db_svr ):
102- db_svr .create_tables ()
103- assert len (db_svr .get_watchtowers ()) >= 0
17+ def test_create_table (file_db_svr ):
18+ file_db_svr .create_tables ()
19+ assert len (file_db_svr .get_watchtowers ()) >= 0
10420
10521
106- def test_watchtower_crud (db_svr , custom_macro_map ):
22+ def test_watchtower_crud (file_db_svr , test_data_db_url , custom_macro_map ):
10723 wt_name = 'score of ${today}'
10824 query = "SELECT * FROM score where date='${today}'"
10925 params = dict (
11026 schedule = "12:00" ,
11127 validator_success_method = 'all' ,
11228 success_method = 'all' ,
11329 )
114- connection = dw_test_data_db_url
30+ connection = test_data_db_url
11531 # 先删除存在的
116- db_svr .delete_watchtower (wt_name )
32+ file_db_svr .delete_watchtower (wt_name )
11733
11834 data_loader = DatabaseLoader (query = query , connection = connection )
11935 watchtower = Watchtower (name = wt_name , data_loader = data_loader , custom_macro_map = custom_macro_map , ** params )
120- db_svr .add_watchtower (watchtower )
121- wt = db_svr .get_watchtower (wt_name )
36+ file_db_svr .add_watchtower (watchtower )
37+ wt = file_db_svr .get_watchtower (wt_name )
12238 assert wt ['name' ] == wt_name
12339 assert wt ['data_loader' ]['__class__' ] == DatabaseLoader .module_path ()
12440 assert wt ['data_loader' ]['query' ] == query
@@ -133,30 +49,24 @@ def test_watchtower_crud(db_svr, custom_macro_map):
13349 query = "SELECT * FROM score where date='${today}' and 1=1 "
13450 data_loader = DatabaseLoader (query = query , connection = connection )
13551
136- db_svr .update_watchtower (name = wt_name , data_loader = data_loader , params = params )
137- wt = db_svr .get_watchtower (wt_name )
52+ file_db_svr .update_watchtower (name = wt_name , data_loader = data_loader , params = params )
53+ wt = file_db_svr .get_watchtower (wt_name )
13854 assert wt ['name' ] == wt_name
13955 assert wt ['data_loader' ]['__class__' ] == DatabaseLoader .module_path ()
14056 assert wt ['data_loader' ]['query' ] == query
14157 assert wt ['data_loader' ]['connection' ] == connection
14258 assert wt ['params' ] == params
14359
144- assert db_svr .delete_watchtower (wt_name ) == 1
145- wt = db_svr .get_watchtower (wt_name )
60+ assert file_db_svr .delete_watchtower (wt_name ) == 1
61+ wt = file_db_svr .get_watchtower (wt_name )
14662 assert wt is None
14763
14864
149- def test_case1 (db_svr ):
65+ def test_case1 (file_db_svr , test_data_db , test_data_db_url , custom_macro_map ):
15066 wt_name = 'score of ${today}'
151- # 自定义宏模板
152- custom_macro_map = {
153- 'today' : {'impl' : lambda : datetime .datetime .today ().strftime ("%Y-%m-%d" )},
154- 'start_date' : '2024-04-01' ,
155- 'column' : 'name' ,
156- }
15767 # 设置数据加载器,用来加载需要校验的数据
15868 query = "SELECT * FROM score where date='${today}'"
159- data_loader = DatabaseLoader (query = query , connection = dw_test_data_db_url )
69+ data_loader = DatabaseLoader (query = query , connection = test_data_db_url )
16070 # 创建监控项
16171 watchtower = Watchtower (name = wt_name , data_loader = data_loader , custom_macro_map = custom_macro_map )
16272 # 添加校验器
@@ -173,11 +83,11 @@ def test_case1(db_svr):
17383 assert wt_name == watchtower .name
17484
17585 # 保存监控配置
176- db_svr .add_watchtower (watchtower )
86+ file_db_svr .add_watchtower (watchtower )
17787 # 保存监控结果
178- db_svr .save_result (watchtower , result )
88+ file_db_svr .save_result (watchtower , result )
17989
180- item = db_svr .get_watchtower (wt_name )
90+ item = file_db_svr .get_watchtower (wt_name )
18191 watchtower = Watchtower .from_dict (item )
18292
18393 watchtower .set_custom_macro (** custom_macro_map )
@@ -193,4 +103,3 @@ def test_case1(db_svr):
193103 watchtower .macro_template .macro_config = result ['macro_maps' ]
194104 assert result ['name' ] == watchtower .macro_template .apply_string (watchtower .name )
195105 assert wt_name == watchtower .name
196- return
0 commit comments