首页 文章 精选 留言 我的

精选列表

搜索[项目自动化构建工具],共10000篇文章
优秀的个人博客,低调大师

[雪峰磁针石博客]flask构建自动化测试平台6-交互式犯罪地图

6-交互式犯罪地图 本章将介绍以下主题: mysql 创建犯罪地图 本文最新版本 代码地址 安装mysql # apt-get install mysql-server # pip3 install pymysql # python db_setup.py # 创建数据库 dbconfig.py test = False db_user = 'root' db_password = '654321_' db_setup.py import pymysql import dbconfig connection = pymysql.connect(host='localhost', user=dbconfig.db_user, passwd=dbconfig.db_password) try: with connection.cursor() as cursor: sql = "CREATE DATABASE IF NOT EXISTS crimemap" cursor.execute(sql) sql = """CREATE TABLE IF NOT EXISTS crimemap.crimes ( id int NOT NULL AUTO_INCREMENT, latitude FLOAT(10,6), longitude FLOAT(10,6), date DATETIME, category VARCHAR(50), description VARCHAR(255), updated_at TIMESTAMP, PRIMARY KEY (id) )""" cursor.execute(sql) connection.commit() finally: connection.close() crimemap.py from dbhelper import DBHelper from flask import Flask from flask import render_template from flask import request app = Flask(__name__) DB = DBHelper() @app.route("/") def home(): try: data = DB.get_all_inputs() except Exception as e: print(e) data = None return render_template("home.html", data=data) @app.route("/add", methods=["POST"]) def add(): try: data = request.form.get("userinput") DB.add_input(data) except Exception as e: print(e) return home() @app.route("/clear") def clear(): try: DB.clear_all() except Exception as e: print(e) return home() if __name__ == '__main__': app.run(host='0.0.0.0',port=8000, debug=True) dbhelper.py import pymysql import dbconfig class DBHelper: def connect(self, database="crimemap"): return pymysql.connect(host='localhost', user=dbconfig.db_user, passwd=dbconfig.db_password, db=database) def get_all_inputs(self): connection = self.connect() try: query = "SELECT description FROM crimes;" with connection.cursor() as cursor: cursor.execute(query) return cursor.fetchall() finally: connection.close() def add_input(self, data): connection = self.connect() try: query = "INSERT INTO crimes (description) VALUES (%s);" with connection.cursor() as cursor: cursor.execute(query, data) connection.commit() finally: connection.close() def clear_all(self): connection = self.connect() try: query = "DELETE FROM crimes;" with connection.cursor() as cursor: cursor.execute(query) connection.commit() finally: connection.close() home.html <html> <body> <head> <title>Crime Map</title> </head> <h1>Crime Map</h1> <form action="/add" method="POST"> <input type="text" name="userinput"> <input type="submit" value="Submit"> </form> <a href="/clear">clear</a> {% for userinput in data %} <p>{{userinput}}</p> {% endfor %} </body> </html> 参考资料 本文相关书籍下载 讨论 钉钉免费群21745728 qq群144081101 567351477 本文涉及的python测试开发库 谢谢点赞! 本文代码地址

优秀的个人博客,低调大师

关于项目自动化测试架构的改良计划 - 对于内容文件动作指令信息

我们分为3个方法依次对于<add_elements>,<update_elements>,<remove_elements>进行解析: 对于<add_elements>内部遍历解析的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /** * add the new information which configured in original xml and finally generate the new xml */ publicstaticString addElementToXML(String xmlString ,XMLModifyInfoExtractor extractor,String originalFilePath) throwsException{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); extractor.extractModifyInfo(originalFilePath); //All the add information are provided by XMLModifyInfoExtractor List<AddElement> addElementInfoList = extractor.getAddElementInfoList(); List<Node> nodes ; for (AddElement addElement : addElementInfoList){ String testcaseXPath =addElement.getTestcaseXPath(); String path =addElement.getPath(); String value=addElement.getValue(); //make the value as a Element block Element newElementSnippet = DocumentHelper.parseText(value).getRootElement(); nodes = doc.selectNodes(path); for (Node node :nodes){ //if in the node is in matching testcase ,then remove it String nodeUniquePath = node.getUniquePath(); if (nodeUniquePath.indexOf(testcaseXPath) !=- 1 ){ //node.getParent().remove(node); //node.setText(value); Element addingPointElement = (Element) node; addingPointElement.add(newElementSnippet); } } } returndoc.asXML(); } 对于<update_elements>内部元素进行遍历的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /** * update the information which configured in original xml and finally generate the new xml */ publicstaticString updateElementFromXML(String xmlString ,XMLModifyInfoExtractor extractor,String originalFilePath) throwsException{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); extractor.extractModifyInfo(originalFilePath); //All the update information are provided by XMLModifyInfoExtractor List<UpdateElement> updateElementInfoList = extractor.getUpdateElementInfoList(); List<Node> nodes ; for (UpdateElement updateElement : updateElementInfoList){ String testcaseXPath =updateElement.getTestcaseXPath(); String path =updateElement.getPath(); String value=updateElement.getValue(); nodes = doc.selectNodes(path); for (Node node :nodes){ //if in the node is in matching testcase ,then remove it String nodeUniquePath = node.getUniquePath(); if (nodeUniquePath.indexOf(testcaseXPath) !=- 1 ){ node.setText(value); } } } returndoc.asXML(); } 对于<remove_elements>中元素进行遍历解析的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /** * remove the information which configured in original xml and finally generate the new xml */ publicstaticString removeElementFromXML(String xmlString ,XMLModifyInfoExtractor extractor,String originalFilePath) throwsException{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); extractor.extractModifyInfo(originalFilePath); //All the remove information are provided by XMLModifyInfoExtractor List<RemoveElement> removeElementInfoList = extractor.getRemoveElementInfoList(); List<Node> nodes ; for (RemoveElement removeElement : removeElementInfoList){ String testcaseXPath =removeElement.getTestcaseXPath(); String path =removeElement.getPath(); nodes = doc.selectNodes(path); for (Node node :nodes){ //if in the node is in matching testcase ,then remove it String nodeUniquePath = node.getUniquePath(); if (nodeUniquePath.indexOf(testcaseXPath) !=- 1 ){ node.getParent().remove(node); } } } returndoc.asXML(); } 最后,当执行3步骤动作系列转化之后,最终的xml文件就是包含最终的我们修改后的结果了。 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1221752,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册