#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)