|
|
#gjl
|
|
|
import json
|
|
|
|
|
|
# 导入 Django 测试框架所需的核心类和模块
|
|
|
from django.test import Client, RequestFactory, TestCase
|
|
|
|
|
|
# 导入项目中使用的自定义用户模型和位置日志模型,用于在测试中创建用户和验证数据
|
|
|
from accounts.models import BlogUser
|
|
|
from .models import OwnTrackLog
|
|
|
|
|
|
|
|
|
# Create your tests here.
|
|
|
|
|
|
# 定义一个测试类,用于测试 OwnTrackLog 相关的功能,如数据接收、地图展示、数据查询等
|
|
|
# 继承自 Django 的 TestCase,提供数据库隔离、断言方法和测试工具
|
|
|
class OwnTrackLogTest(TestCase):
|
|
|
# gjl setUp 方法在每个测试方法执行前自动运行,用于准备测试所需的环境和对象
|
|
|
# gjl 本方法中初始化了测试客户端和请求工厂,便于模拟 HTTP 请求
|
|
|
def setUp(self):
|
|
|
# 创建一个 Django 测试客户端实例,用于模拟浏览器发送 GET、POST 等请求
|
|
|
self.client = Client()
|
|
|
|
|
|
# gjl 创建一个请求工厂实例,用于创建伪造的 HTTP 请求对象(如 HttpRequest)
|
|
|
# gjl 适用于需要直接调用视图函数的测试场景(本测试中未直接使用,但已准备)
|
|
|
self.factory = RequestFactory()
|
|
|
|
|
|
# gjl test_own_track_log 是一个具体的测试用例,用于验证 OwnTrackLog 功能的正确性
|
|
|
# gjl 测试内容包括:接收位置数据、数据完整性、权限控制、页面响应等
|
|
|
def test_own_track_log(self):
|
|
|
# gjl 构造一个模拟的位置数据字典,包含 tid(用户标识)、lat(纬度)、lon(经度)
|
|
|
o = {
|
|
|
'tid': 12,
|
|
|
'lat': 123.123,
|
|
|
'lon': 134.341
|
|
|
}
|
|
|
|
|
|
# gjl 使用测试客户端发送一个 POST 请求到 '/owntracks/logtracks' 接口
|
|
|
# gjl 将位置数据 o 序列化为 JSON 字符串,并设置内容类型为 application/json
|
|
|
# gjl 模拟 OwnTracks 客户端上传位置信息
|
|
|
self.client.post(
|
|
|
'/owntracks/logtracks',
|
|
|
json.dumps(o),
|
|
|
content_type='application/json')
|
|
|
|
|
|
# 查询数据库中 OwnTrackLog 模型的所有记录数量
|
|
|
length = len(OwnTrackLog.objects.all())
|
|
|
|
|
|
# 断言:验证数据库中记录数为 1,确保第一次 POST 请求成功写入一条数据
|
|
|
self.assertEqual(length, 1)
|
|
|
|
|
|
# 构造第二条位置数据,缺少 'lon' 字段(经度)
|
|
|
o = {
|
|
|
'tid': 12,
|
|
|
'lat': 123.123
|
|
|
}
|
|
|
|
|
|
# 再次发送 POST 请求上传不完整的位置数据
|
|
|
self.client.post(
|
|
|
'/owntracks/logtracks',
|
|
|
json.dumps(o),
|
|
|
content_type='application/json')
|
|
|
|
|
|
# 再次查询数据库中的总记录数
|
|
|
length = len(OwnTrackLog.objects.all())
|
|
|
|
|
|
# 断言:验证记录数仍为 1,确保系统能正确处理不完整数据(如忽略或拒绝),未新增无效记录
|
|
|
self.assertEqual(length, 1)
|
|
|
|
|
|
# 发送 GET 请求访问 '/owntracks/show_maps' 页面(查看地图)
|
|
|
rsp = self.client.get('/owntracks/show_maps')
|
|
|
|
|
|
# 断言:检查响应状态码为 302(重定向),说明未登录用户访问地图页时被重定向(如跳转到登录页)
|
|
|
self.assertEqual(rsp.status_code, 302)
|
|
|
|
|
|
# gjl 创建一个超级用户,用于测试需要登录权限的功能
|
|
|
# gjl 使用 BlogUser 模型的 create_superuser 方法创建具有管理员权限的测试用户
|
|
|
user = BlogUser.objects.create_superuser(
|
|
|
email="liangliangyy1@gmail.com",
|
|
|
username="liangliangyy1",
|
|
|
password="liangliangyy1")
|
|
|
|
|
|
# gjl 使用测试客户端以刚创建的超级用户身份登录
|
|
|
# gjl 模拟用户登录过程,使后续请求具有认证状态
|
|
|
self.client.login(username='liangliangyy1', password='liangliangyy1')
|
|
|
|
|
|
# 手动创建一条 OwnTrackLog 记录并保存到数据库
|
|
|
# 直接操作模型,用于准备测试数据
|
|
|
s = OwnTrackLog()
|
|
|
s.tid = 12
|
|
|
s.lon = 123.234
|
|
|
s.lat = 34.234
|
|
|
s.save()
|
|
|
|
|
|
# 发送 GET 请求访问 '/owntracks/show_dates' 页面(查看日期列表)
|
|
|
rsp = self.client.get('/owntracks/show_dates')
|
|
|
|
|
|
# 断言:检查响应状态码为 200(成功),说明登录后可以正常访问该页面
|
|
|
self.assertEqual(rsp.status_code, 200)
|
|
|
|
|
|
# 发送 GET 请求访问 '/owntracks/show_maps' 页面(查看地图)
|
|
|
rsp = self.client.get('/owntracks/show_maps')
|
|
|
|
|
|
# 断言:检查响应状态码为 200(成功),说明登录后可以正常访问地图页面
|
|
|
self.assertEqual(rsp.status_code, 200)
|
|
|
|
|
|
# 发送 GET 请求访问 '/owntracks/get_datas' 接口(获取位置数据)
|
|
|
rsp = self.client.get('/owntracks/get_datas')
|
|
|
|
|
|
# 断言:检查响应状态码为 200(成功),说明数据接口正常返回
|
|
|
self.assertEqual(rsp.status_code, 200)
|
|
|
|
|
|
# 发送 GET 请求访问 '/owntracks/get_datas' 接口,并携带日期查询参数 date=2018-02-26
|
|
|
rsp = self.client.get('/owntracks/get_datas?date=2018-02-26')
|
|
|
|
|
|
# 断言:检查响应状态码为 200(成功),说明带参数的数据查询功能正常
|
|
|
self.assertEqual(rsp.status_code, 200) |