diff --git a/src/test/java/databasetest/DataManagerTest.java b/src/test/java/databasetest/DataManagerTest.java
new file mode 100644
index 0000000..1256240
--- /dev/null
+++ b/src/test/java/databasetest/DataManagerTest.java
@@ -0,0 +1,5 @@
+package databasetest;
+
+public class DataManagerTest {
+    
+}
diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 3c4898b..104f017 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -1,4 +1,6 @@
 package trackertest;
+
+import java.io.File;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -19,6 +21,7 @@
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 
+import entity.Seed;
 import entity.TransRecord;
 import entity.TransportId;
 import entity.config;
@@ -66,6 +69,19 @@
 
     @AfterAll
     static void teardown() {
+        // 清理：删除测试过程中保存的所有 torrent 文件
+        File storageDir = new File(config.TORRENT_STORAGE_DIR);
+        if (storageDir.exists() && storageDir.isDirectory()) {
+            File[] files = storageDir.listFiles();
+            if (files != null) {
+                for (File f : files) {
+                    if (f.isFile()) {
+                        f.delete();
+                    }
+                }
+            }
+        }
+
         if (em != null && em.isOpen()) em.close();
         if (emf != null && emf.isOpen()) emf.close();
     }
@@ -298,4 +314,80 @@
             }))
             .collect(Collectors.toList());
     }
+
+    @TestFactory
+    Collection<DynamicTest> testSaveTorrent() {
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        return seedIds.stream()
+            .map(sid -> DynamicTest.dynamicTest("SaveTorrent for seed " + sid, () -> {
+                // 准备一个临时空文件
+                File temp = File.createTempFile(sid + "_test", ".torrent");
+                // 调用 SaveTorrent
+                int ret = tracker.SaveTorrent(sid, temp);
+                Assertions.assertEquals(0, ret, "SaveTorrent 应返回 0");
+
+                // 验证文件已按约定存储
+                File stored = new File(config.TORRENT_STORAGE_DIR,
+                                       sid + "_" + temp.getName());
+                Assertions.assertTrue(stored.exists(), "存储文件应存在");
+
+                // 验证数据库中 url 字段已更新
+                em.clear();
+                Seed seed = em.find(Seed.class, sid);
+                // 将 seed.url 转为 File 再取绝对路径进行比较
+                Assertions.assertEquals(
+                    stored.getAbsolutePath(),
+                    new File(seed.url).getAbsolutePath(),
+                    "Seed.url 应更新为存储路径"
+                );
+
+                // 清理测试文件
+                stored.delete();
+                temp.delete();
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetTTorent() {
+        // 拿到所有 seedid
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        return seedIds.stream()
+            .map(sid -> DynamicTest.dynamicTest("GetTTorent for seed " + sid, () -> {
+                // 准备一个临时空文件并 SaveTorrent
+                File temp = File.createTempFile(sid + "_test", ".torrent");
+                int saveRet = tracker.SaveTorrent(sid, temp);
+                Assertions.assertEquals(0, saveRet, "SaveTorrent 应返回 0");
+
+                // 刷新上下文并取回更新后的 seed 实体
+                em.clear();
+                Seed seed = em.find(Seed.class, sid);
+                Assertions.assertNotNull(seed.url, "Seed.url 应已被更新");
+
+                // 调用 GetTTorent 并断言路径一致
+                String uid = userIds.get(0), ip = "127.0.0.1";
+                File ret = tracker.GetTTorent(sid, uid, ip);
+                File expected = new File(seed.url);
+                Assertions.assertNotNull(ret, "应返回文件对象");
+                Assertions.assertEquals(
+                    expected.getAbsolutePath(),
+                    ret.getAbsolutePath(),
+                    "返回文件路径应与Seed.url一致"
+                );
+
+                // 清理：删掉本地文件，回滚 DB url 字段，删掉 temp
+                expected.delete();
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                seed.url = null;
+                em.merge(seed);
+                tx.commit();
+                temp.delete();
+            }))
+            .collect(Collectors.toList());
+    }
 }
