1 import os.path
2 import random
3 from flask import Flask, request
4 from flask_restful import Resource, Api
5 from flask_sqlalchemy import SQLAlchemy
6 from jenkinsapi.jenkins import Jenkins
7
8 """
9 采用flask,flask_restful,flask_sqlalchemy,版本均为目前最新版本
10 """
11 app = Flask(__name__)
12 api = Api(app)
13 app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@127.0.0.1/gin?charset=utf8mb4"
14 with app.app_context():
15 db = SQLAlchemy(app)
16
17 class TestCase(db.Model):
18 __tablename__ = "test_case"
19 name = db.Column(db.String(80), primary_key=True)
20 description = db.Column(db.String(100), unique=False, nullable=True)
21 file_name = db.Column(db.String(100), unique=False, nullable=True)
22 content = db.Column(db.String(1024), unique=False, nullable=False)
23 report = db.relationship("Report", backref="test_case", lazy=True)
24
25 def __repr__(self):
26 return "<TestCase %r>" % self.name
27
28 class Report(db.Model):
29 id = db.Column(db.Integer, primary_key=True)
30 description = db.Column(db.String(100), unique=False, nullable=True)
31 dir = db.Column(db.String(300), unique=False, nullable=False)
32 testcase_id = db.Column(db.String(80), db.ForeignKey('test_case.name'), nullable=False)
33
34 def __repr__(self):
35 return "<Report %r>" % self.id
36
37 # 创建数据库
38 # db.drop_all()
39 # db.create_all()
40
41
42 class TestCaseServer(Resource):
43 # 上传用例命令: curl -F "file=@starttime.py" http://127.0.0.1:8081/testcasefile -v
44 # 上传用例命令: curl -F "file=@starttime.py" -F "name=starttime" http://127.0.0.1:8081/testcasefile
45 def post(self):
46 if "file" in request.files and "name" in request.form:
47 # 判断请求中是否包含文件名
48 f = request.files["file"]
49 name = request.form["name"]
50 # 提取文件的文件名
51 file_name = f.filename
52 # 获取文件内容
53 content = f.read()
54 # 存入数据库
55 testcase = TestCase(name=name, file_name=file_name, content=content)
56 db.session.add(testcase)
57 db.session.commit()
58 # # 设置文件本地保存的路径
59 # f.save(os.path.join("./upload", file_name))
60 return {"status": "success", "message": "file uploaded successfully"}
61 else:
62 return {"status": "failed", "message": "file uploaded failed"}
63
64
65 # curl获取脚本并保存在本地且命名为abc.py: curl.exe -o "abc.py" http://127.0.0.1:8081/testcaserun
66 @app.route('/get_testcase', methods=['GET'])
67 def get_testcase():
68 if "name" in request.args:
69 name = request.args["name"]
70 print(name) # 打印get请求中的name参数值
71 # 返回存在数据库中的脚本
72 testcase = TestCase.query.filter_by(name=name).first()
73 # print(type(testcase.content)) # <class 'str'>
74 # print(testcase.content) # 文件的内容
75 return testcase.content
76
77
78 # 平台实现使用接口启动jenkins(run)
79 @app.route('/run', methods=['GET'])
80 def run():
81 if "name" in request.args:
82 name = request.args["name"]
83 testcase = TestCase.query.filter_by(name=name).first()
84 j = Jenkins('http://127.0.0.1:8080/jenkins', username='hankai', password='11f229d6bf0a95971de5297aba499d0f29')
85 print(j.keys()) # 打印jenkins的job
86 j["cekai16"].invoke(build_params={"name": name, "file_name": testcase.file_name})
87 return {"status": "success", "message": "call successfully"}
88
89
90 @app.route('/report_upload', methods=['POST'])
91 def report_upload():
92 if "file" in request.files and "name" in request.form:
93 file = request.files["file"]
94 name = request.form["name"]
95 DIR = r"C:\Users\love8\Desktop\tmp"
96 file_name = file.filename
97 dir = os.path.join(DIR, file_name)
98 file.save(dir)
99 report = Report(dir=dir, testcase_id=name)
100 db.session.add(report)
101 db.session.commit()
102 return {"status": "success", "message": "call successfully"}
103
104
105 api.add_resource(TestCaseServer, '/testcasefile')
106
107
108 if __name__ == '__main__':
109 app.run(host='0.0.0.0', port=8081, debug=True)