fix: new_visitors 排爬虫+日界/爬虫口径回归测试
- refresh_daily new_visitors 加 is_bot=False(爬虫不是受众,四指标口径统一) - test_refresh_daily_shanghai_boundary:固定 UTC 时间戳钉死上海自然日界 - test_refresh_daily_excludes_bots:事件/会话/访客 is_bot 均不计入 - refresh_stats 删未使用的 stat = 赋值 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from datetime import timedelta
|
||||
from datetime import date, timedelta
|
||||
from django.utils import timezone
|
||||
from tracker.models import Site, Visitor, VisitSession, Event
|
||||
from tracker.services.stats import refresh_daily
|
||||
@@ -28,3 +28,33 @@ def test_refresh_daily_two_days(db):
|
||||
# (auto_now_add),故昨天 new=0、今天 new=2(v1+v2)——按 first_seen_at 真实语义断言
|
||||
assert (y.pv, y.uv, y.sessions, y.new_visitors) == (3, 1, 1, 0)
|
||||
assert (t.pv, t.uv, t.sessions, t.new_visitors) == (6, 2, 2, 2) # 今天:pv=6 uv=2(v1+v2) sessions=2 new=2(v1+v2)
|
||||
|
||||
def test_refresh_daily_shanghai_boundary(db):
|
||||
# 固定时间戳钉死日界(不依赖运行时刻):UTC 2026-09-15T16:30 = 上海 09-16 00:30 → 落 9-16 不落 9-15
|
||||
site = Site.objects.create(name="s", domains=["a.com"])
|
||||
v = Visitor.objects.create(site=site, visitor_id="v")
|
||||
s = VisitSession.objects.create(site=site, visitor=v, session_id="s",
|
||||
started_at="2026-09-15T16:30:00Z", ended_at="2026-09-15T16:30:00Z")
|
||||
Event.objects.create(site=site, visitor=v, session=s, event_id="e",
|
||||
event_name="page_view", occurred_at="2026-09-15T16:30:00Z", path="/")
|
||||
d15 = refresh_daily(site, date(2026, 9, 15))
|
||||
d16 = refresh_daily(site, date(2026, 9, 16))
|
||||
assert (d15.pv, d16.pv) == (0, 1)
|
||||
|
||||
def test_refresh_daily_excludes_bots(db):
|
||||
# 爬虫口径:事件/会话/访客三处 is_bot 均不计入四指标(与 pv/uv/sessions 统一)
|
||||
site = Site.objects.create(name="s", domains=["a.com"])
|
||||
bot = Visitor.objects.create(site=site, visitor_id="bot", is_bot=True)
|
||||
human = Visitor.objects.create(site=site, visitor_id="human")
|
||||
bs = VisitSession.objects.create(site=site, visitor=bot, session_id="bs",
|
||||
started_at="2026-09-15T10:00:00Z", ended_at="2026-09-15T10:01:00Z")
|
||||
hs = VisitSession.objects.create(site=site, visitor=human, session_id="hs",
|
||||
started_at="2026-09-15T10:00:00Z", ended_at="2026-09-15T10:01:00Z")
|
||||
Event.objects.create(site=site, visitor=bot, session=bs, event_id="b1",
|
||||
event_name="page_view", occurred_at="2026-09-15T10:00:00Z", path="/", is_bot=True)
|
||||
Event.objects.create(site=site, visitor=human, session=hs, event_id="h1",
|
||||
event_name="page_view", occurred_at="2026-09-15T10:00:30Z", path="/")
|
||||
d = refresh_daily(site, date(2026, 9, 15))
|
||||
assert (d.pv, d.uv, d.sessions) == (1, 1, 1) # 只计 human 的事件/会话
|
||||
t = refresh_daily(site, timezone.localdate()) # 两位访客 first_seen_at 均为运行时,刷今天窗口才能非空验证 new_visitors
|
||||
assert t.new_visitors == 1 # 爬虫访客不计入新增
|
||||
|
||||
Reference in New Issue
Block a user