1.目录结构
2.UnitTest Mock Server
# A开发 注册功能
def test_demo1():
pass
# B开发 登录
def test_login():
pass
# C开发 首页 用到注册和登录的功能数据
# 调用 接口 C开发调用ab开发的功能写完了模块 静静等着 ab开发 测试
# 调试
from class41.demo1 import test_demo1
from class41.demo2 import test_login
def fun():
# res1和res2都有值 返回1
res1 = test_demo1()
res2 = test_login()
if res1 and res2:
return 1
else:
return 2
import unittest
from unittest import mock
from class41 import demo1, demo2, demo3
class TestCase(unittest.TestCase):
# 注册的功能 有值给我
# 登录的功能 有值给我
def testcase01(self):
demo3.test_demo1 = mock.Mock(return_value=1)
demo3.test_login = mock.Mock(return_value=0)
self.assertEqual(2,demo3.fun())
if __name__ == '__main__':
unittest.main()
# mock 创建真实的数据 a开发 b开发的功能也没动 不能动他们的代码
# 数据 用mock去创建数据 返回数据 真实的数据 看你写的代码 能不能去使用这些数据
# 开发 a 注册
# b 登录
# c 首页 登录 注册 没注册
# unittest的mock 构造了返回值 给到 a注册 给到了b开发登录的值
# 断言
3.基于Flask框架实现Mock Server
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Refresh" content="30">
<meta charset="utf-8">
<title>登录界面</title>
<meta name="Keywords" content="用户登录界面" >
<meta name="Description" content="只需登录的时候输入正确,你就可以放心上网,玩得更嗨。">
<link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>
<p>显示所有界面</p>
{% for project in projects %}
项目名称:
<a href="/build?project={{project}}">{{project}}</a>
{% endfor %}
</body>
</html>
from time import sleep
from selenium import webdriver
def test_baidu():
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(3)
driver.quit()
from time import sleep
from selenium import webdriver
def test_jd():
driver = webdriver.Chrome()
driver.get('http://www.jd.com')
sleep(3)
driver.quit()
# flask
# 1.导包 from flask import Flask
# 2.实例化 Flask
# 3.创建路由
'''
@app.route('/home')
def first_flask():
return 'hello flask'
'''
# @app.route(页面路径,请求方式)
# 函数体
# 运行app.run() 实时更新代码 debug = True app.run(debug=True)
from pathlib import Path
import pytest
from flask import Flask, request, jsonify, render_template
app = Flask(__name__)
# 没写请求方式 默认get访问
# @app.route('/api/login')
# def first_flask():
# return 'hello flask'
# 改成post请求
# @app.route('/api/login',methods=['post'])
# def first_flask():
# return 'hello flask'
# @app.route('/api/login',methods=['post','get'])
# def first_flask():
# return 'hello flask'
# 里面 函数传参进来 接受 与requests不同
# @app.route('/api/login',methods=['post','get'])
# def login():
# print(request.get_json())
# print(request.get_data())
# 传参
# 题目:
#传参数 登录 传过来的数据 是admin和123456 认为登录成功 否则认为登录失败
# 1.先要获得postman里面传输了什么数据
# 2.拿到对应的数据 判断
# 3.如果传过来的值是admin和123456 登录成功 否则登录失败
# 4.判断传过来的值是admin和123456
# @app.route('/api/login',methods=['post','get'])
# def login():
# # print(request.get_json())
# data = request.get_json()
# username = data['username']
# password = data['password']
# if (2 < len(username) <18) and (2<len(password)<18):
# if username == 'admin' and password == '123456':
# return '用例成功'
# else:
# return '用例失败'
# else:
# return '用户名或者密码不符合要求'
# 如果说 登录 需求 用户名和密码长度 不能小于2 大于18 再来一个if
# 这个if再加到上一层 符合日常思维
# 返回数据的 返回的是登录成功 登录失败
# 返回真实点
# @app.route('/api/login',methods=['post','get'])
# def login():
# # print(request.get_json())
# data = request.get_json()
# username = data['username']
# password = data['password']
# if (2 < len(username) <18) and (2<len(password)<18):
# if username == 'admin' and password == '123456':
# return jsonify({ "adress": { "city": "changsha" }, "httpstatus": 200, "info": { "age": 18, "name": "admin" }, "msg": "success", "token": "23657DGYUSGD126731638712GE18271H" })
# else:
# return jsonify({ "code": "001", "msg": "用户名或密码错误" })
# else:
# return '用户名或者密码不符合要求'
# 百度 返回来的数据格式 返回来的是html页面
# @app.route('/api/login',methods=['post','get'])
# def home():
# return '''
# 请输入用户名: <input type='text' name = 'username'>
# 请输入密码: <input type='password' name = 'password'>
# '''
# 直接返回一个html页面
# @app.route('/api/login',methods=['post','get'])
# def home():
# return render_template('index2.html')
# 页面中显示数据 html页面中要拿到传过来的数据 html循环数据 projects
# @app.route('/api/login',methods=['post','get'])
# def home():
# projects = ['project1','project2']
# return render_template('index3.html',projects = projects)
# 练习 扩展
# 通过在页面上点击链接 能自动触发到我的项目 触发百度启动 文件夹的名称
# app.root_path 根目录 class41
# 这个函数我想要实现的事情是拿到workspace文件中的目录文件和文件名称
@app.route('/api/login',methods=['post','get'])
def home():
workspace = Path(app.root_path)/'workspace'
projects = [projects.name for projects in workspace.iterdir()]
return render_template('index3.html', projects=projects)
# 拿到文件名称之后 点击文件 点击request就运行百度 点击selenium就运行京东
# 在页面上点击request 跳转到build这个路由里面就用pytest触发百度执行 京东执行
@app.route('/build',methods=['post','get'])
def build():
project_name = request.args.get('project')
pytest.main([f'workspace/{project_name}'])
return '构建成功'
# 运行
if __name__ == '__main__':
# 启动服务 实时更新
# app.run('127.0.0.1','5555')
app.run(debug = True)