有关博客博客系统的测试报告 --- 初次进行项目测试篇

news2024/11/23 21:41:00

文章目录

  • 前言
  • 一、博客系统的项目背景
  • 二、博客系统的项目简介
    • 1.后端功能
      • 1.1 用户管理
      • 1.2 博客管理
      • 1.3 权限管理
    • 2.前端功能
      • 2.1 用户界面
  • 测试计划
  • 测试工具、环境
  • 设计的测试动作
  • 功能测试
    • 访问博客登录页面
    • 博客首页测试
    • 博客详情页
    • 博客编辑页
  • 自动化测试
    • 自动化测试用例
    • 自动化测试脚本
      • 生成配置程序的文件
      • 登录界面测试脚本
      • 博客首页测试脚本
      • 博客编辑页测试脚本
      • 整体控制的测试脚本
  • 项目测试bug简述
    • 通过功能测试发现的bug
    • 通过自动化测试发现的bug
  • 测试总结


前言

这是一份有关博客系统项目的测试报告,里面主要是讲解了测试方式以及使用了何测试软件程序。
总之就是一份自己编写的测试报告进行练习。


一、博客系统的项目背景

本项目是基于SSM框架开发的个人博客系统测试。该系统采用前后端分离架构,前端页面通过Vue或React等技术实现,后端则使用Spring、Spring MVC和MyBatis(SSM)组合来处理业务逻辑。系统的主要功能包括用户登录、博客编辑、注销、删除博客等。数据库用于存储博客内容、用户信息等数据。前端主要由四个页面组成:登录页面、博客列表页、博客详情页和博客编辑页。在前后端的协作下,成功实现了个人博客的列表展示与管理。

二、博客系统的项目简介

1.后端功能

1.1 用户管理

用户注册与登录:允许新用户注册账号,并使用注册的账号登录系统。
用户信息维护:用户可以查看和编辑自己的个人信息(如用户名、密码、邮箱等,但密码通常不会明文显示,而是提供修改密码的功能)。
用户注销:提供用户注销登录的功能。

1.2 博客管理

博客创建与编辑:允许用户创建新的博客文章,并对已发布的文章进行编辑。
博客删除:用户可以删除自己发布的博客文章。
博客列表获取:后端需要提供API接口,以便前端获取用户发布的所有博客文章列表。

1.3 权限管理

用户角色划分:虽然这是一个个人博客系统,但也可以考虑设置不同的用户角色(如管理员和普通用户),以便未来扩展功能。
权限控制:根据用户角色,控制其对不同功能的访问权限。

2.前端功能

2.1 用户界面

登录页面:提供用户登录的表单界面,包括用户名和密码输入框,以及登录按钮。
博客列表页:展示用户发布的所有博客文章列表,包括文章标题、摘要、发布时间等信息。
博客详情页:展示博客文章的详细内容,包括标题、正文、发布时间、作者信息等。
博客编辑页:提供博客文章编辑的表单界面,包括标题、正文等输入框,以及保存按钮。

测试计划

功能后端开发前端开发提测日期测试测试日期测试结果
登录界面汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
博客首页汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
博客详情页汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
博客编辑页汤大帅哥甜甜绵姐姐2024.11.10Edd2024.11.21测试通过
回归测试Edd2024.11.21测试通过

在1、2、3、4行一般在工作中可能会要求测试报告的格式,但我们学习阶段中尽可能不要将测试报告写的如此简单。

什么是提测日期?提测日期是项目开发完成后,提交给测试的日期
那一般来说项目是分开提测还是整体提测之后测试再介入呢?

这要取决于不同的页面之间是否存在测试耦合的地方,如果存在大量的耦合则需要整体进行提测,反之低耦合的话我们是可以分开进行提测的,但目前我们是假设需要整体进行提测

什么是回归测试
首先系统每个页面都是独立来测试的,我们可以看见1、2、3、4相当于是一个独立的页面进行单独测试,但最后我们还是要加上回归测试,将整个页面再回归一次整体进行测试,判断系统是否可以正常的去使用。

针对博客系统的测试我们主要是使用selenium进行自动化测试,就使用Xmind绘制脑图,会在脑图是为了先进行一遍测试规划,为了后期测试以及自动化测试流程进行梳理,由于只是针对web界面的测试,所以我们只要针对界面测试即可。
博客系统自动化测试用例脑图

测试工具、环境

浏览器:Edge、Chrome
工具:Python、PyCharm 2024.2.4、selenium

设计的测试动作

功能测试、自动化测试
功能测试:覆盖到登录页面、博客首页、博客详情页、博客编辑页面等,发现1个问题
自动化测试:覆盖到登录界面、博客首页、博客详情页、博客编辑页面等,发现1个问题

功能测试

访问博客登录页面

手动输入正确的账号和密码 —> 成功进入博客首页
博客系统页面

博客首页
输入错误的账号和密码 —> 提示错误信息

在这里插入图片描述
输入错误的账号和正确的密码 —> 提示错误信息

在这里插入图片描述
输入正确的账号和错误的密码
在这里插入图片描述

博客首页测试

博客首页存在图片、用户名、文章列表
在这里插入图片描述
可点击博客详情页的查看全文按钮 —> 成功跳转
在这里插入图片描述

博客详情页

博客详情页存在标题、时间、博客内容
在这里插入图片描述
未登录的状态下进入博客的URL链接会跳转到登录页面
在这里插入图片描述

博客编辑页

在登录的情况下点击写博客按钮,就可以跳转到博客编辑页
在这里插入图片描述
输入标题以及内容再点击发布文章按钮
在这里插入图片描述

查看博客列表查看是否发布成功
在这里插入图片描述
未登录的情况下进入博客编辑页面
在这里插入图片描述

自动化测试

自动化测试用例

自动化测试用例大致还是使用脑图中的思路去编写用例的。
博客系统自动化测试用例脑图

自动化测试脚本

创建好项目时要查看一下项目是否以及导入了selenium和webdriver_manager库
接下来我们就参考测试用例,去创建自动化测试项目,编写自动化测试脚本
我们分别插件几个目录与文件
在这里插入图片描述

common
Utils.py   作用于生成测试文件中需要用到的配置内容
tests
BlogLogin.py   博客登录页面相关的测试用例
BlogList.py    博客首页相关测试用例
BlogDetail.py   博客编辑页相关测试用例
RunCases.py  用于可控制整体运行的测试用例
images
2024-11-21   根据每天的日期进行分类,当天运行的自动化图片文件放到当天的文件夹下
2024-11-21-123456.png

生成配置程序的文件

common/Utils.py

### 用于创建浏览器对象
import os
import sys
from datetime import datetime

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager




# 创建一个浏览器对象Chrom
class ChromDriver:
    driver = ""
    def __init__(self):
        options = webdriver.ChromeOptions()
        options.add_argument('--start-maximized')
        options.add_argument('--disable-gpu')
        options.add_argument('--no-sandbox')
        # options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
        service = Service(ChromeDriverManager().install())
        self.driver = webdriver.Chrome(service=service, options=options)
        self.driver.implicitly_wait(10)

    def GetScreenShot(self, filename=""):
        dirname = datetime.now().strftime('%Y-%m-%d')
        if not os.path.exists("../images/" + dirname):
            os.mkdir("../images/" + dirname)
        filname = sys._getframe().f_back.f_code.co_name + "-" + filename + "-" + datetime.now().strftime(
            '%Y-%m-%d-%H-%M-%S') + ".png"
        self.driver.save_screenshot("../images/" + dirname + "/" + filname)


# 创建一个浏览器对象Edge
class EdgeDriver:
    driver = ""
    def __init__(self):
        options = webdriver.EdgeOptions()
        options.add_argument('--start-maximized')
        options.add_argument('--disable-gpu')
        options.add_argument('--no-sandbox')
        service = Service(EdgeChromiumDriverManager().install())
        self.driver = webdriver.Edge(service=service, options=options)

    def GetScreenShot(self, filename=""):
        dirname = datetime.now().strftime('%Y-%m-%d')
        if not os.path.exists("../images/" + dirname):
            os.mkdir("../images/" + dirname)
        filname = sys._getframe().f_back.f_code.co_name + "-" + filename + "-" + datetime.now().strftime(
            '%Y-%m-%d-%H-%M-%S') + ".png"
        self.driver.save_screenshot("../images/" + dirname + "/" + filname)


# 使用单例模式
BlogDriver = ChromDriver()
# BlogDriver = EdgeDriver()

以上是有Edge、Chrome浏览器的驱动代码,供自己选择

登录界面测试脚本

tests/BlogLogin.py

### 这是博客登录相关的测试
from time import sleep

from selenium.webdriver.common.by import By

from common.Utils import BlogDriver

class BlogLogin:
    url = ""
    driver = ""
    def __init__(self):
        # 配置登录url
        self.url = "http://8.137.19.140:9090/blog_list.html"
        # 配置deriver
        self.driver = BlogDriver.driver
        # 打开登录页面
        self.driver.get(self.url)
        # 等待页面加载完成
        sleep(3)
        # 刷新登录页面
        self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(4)").click()


    # 成功登录的测试用例
    def LoginSucTest(self):
        try:
            # 清空用户名和密码输入框内容
            self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
            self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
            # 输入用户名
            self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("lisi")
            # 输入密码
            self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
            # 点击登录按钮
            self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
            # 断言登录成功
            # 能够找到博客系统的首页用户名称,说明登录成功,否则登录失败
            sleep(4)
            text = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").text
            assert text == "lisi"
            print("登录测试成功!")
            # 可选:保存截图
            BlogDriver.GetScreenShot()
            
        except Exception as e:
            print(f"登录测试失败,错误信息:{str(e)}")
            raise e  # 重新抛出异常,确保测试用例仍然标记为失败
            
        finally:
            self.driver.back()

    # 失败登录的测试用例
    def LoginFailTest(self,username,password,manner,failname=""):
        try:
            # 清空用户名 和密码输入框内容
            self.driver.find_element(By.CSS_SELECTOR,"#username").clear()
            self.driver.find_element(By.CSS_SELECTOR,"#password").clear()
            # 输入用户名
            self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys(username)
            # 输入密码
            self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys(password)
            # 点击登录按钮
            self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
            sleep(2)
            # 获取弹窗的信息
            alert = self.driver.switch_to.alert
            # 获取弹窗的文本信息
            alert_text = alert.text
            # 断言登录失败
            assert alert_text == manner
            print("测试登录失败!" + manner)
            alert.accept()
            # 可选:保存截图
            BlogDriver.GetScreenShot(failname)

        except Exception as e:
            print(f"登录测试失败,错误信息:{str(e)}")
            raise e  # 重新抛出异常,确保测试用例仍然标记为失败

        finally:
            pass

    def quit(self):
        self.driver.quit()


# login = BlogLogin()
# login.LoginSucTest()
# login.LoginFailTest("ili","1234578","用户不存在","user_fail")
# login.LoginFailTest("ili","123456","用户不存在","user_fail")
# login.LoginFailTest("lisi","1234567","密码错误","password_fail")
# BlogDriver.driver.quit()

博客首页测试脚本

# 这是测试博客列表页的测试案例
from time import sleep

from selenium.webdriver.common.by import By

from common.Utils import BlogDriver

class BlogList:
    url = ""
    driver = ""
    def __init__(self):
        self.driver = BlogDriver.driver
        self.url = "http://8.137.19.140:9090/blog_list.html"
        self.driver.get(self.url)
    # 测试已登录的主页页面
    def ListTest(self):
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > img")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.date")
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc")

        # 测试已经发布文章的数量是否达到
        # articles = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right")
        # assert len(articles) > 5

        # 点击进入文章
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a").click()
        # 判断是否进入文章详情页
        sleep(2)
        title = self.driver.title
        assert title == "博客详情页"
        print("点击文章测试通过")

    # 未登录的状态下进入博客首页
    def ListTestNoLogOn(self):
        # 在已登录的情况下进行注销
        self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()
        # 再进入首页URL
        self.driver.get("http://8.137.19.140:9090/blog_list.html")
        # 通过title判断是否为登录页面,判断是否进入了登录的首页
        sleep(1)
        title = self.driver.title
        assert title == "博客登陆页"
        print("未登录进入博客首页测试通过")

博客编辑页测试脚本

# 这是文章发布测试案例
# 使用前提是已经登录了页面
from selenium.webdriver.common.by import By

from common.Utils import BlogDriver


class BlogDetail():
    driver = ""
    url = ""
    def __init__(self):
        self.driver = BlogDriver.driver
        self.url = "http://8.137.19.140:9090/blog_list.html"
        self.driver.get(self.url)

    # 正常登录的情况下进行博客编写与发布
    def blogPublish(self):
        # 点击发布博客按钮
        self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()
        # 输入博客标题
        self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("123测试博客标题")
        # 可选:保存截图
        BlogDriver.GetScreenShot()
        # 发布博客
        self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
        # 判断是否发布成功
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1549) > div.title")


    # 登录状态下博客详情页的测试
    def DetailTestByLogin(self):
        # 点击博客详情
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a").click()
        # 检查博客标题
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")
        # 检查博客时间
        self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")
        # 检查博客内容
        self.driver.find_element(By.CSS_SELECTOR,"#detail > p")
        print("博客详情页测试通过")

整体控制的测试脚本

from common.Utils import BlogDriver
from tests.BlogLogin import BlogLogin
from tests.BlogList import BlogList
from tests.BlogDetail import BlogDetail

if __name__ == "__main__":
    BlogLogin().LoginFailTest("ili","1234578","用户不存在","user_fail")
    BlogLogin().LoginSucTest()
    BlogList().ListTest()
    BlogList().ListTestNoLogOn()
    BlogLogin().LoginSucTest()
    BlogDetail().DetailTestByLogin()
    BlogDetail().blogPublish()
    BlogDriver.driver.quit()

项目测试bug简述

本次项目测试发现了2个bug,有1个一般级别的bug,1个次要级别的bug。

通过功能测试发现的bug

这边发现一个次要Bug警告吧
主要是我认为未登录的情况下,在登录界面中可以点击写博客按钮(此处还可理解),但是再未登录的情况下进入博客编辑页面,存在注销按钮有些不符常理,我认为可以写个普通Bug吧
在这里插入图片描述
对bug的描述:
次要bug [1.]:
问题出现的环境:谷歌浏览器 版本 131.0.6778.86(正式版本) (64 位)
问题出现的步骤:
&semp;1、打开谷歌浏览器,输入网址 http://8.137.19.140:9090/blog_login.html
&semp;2、不登录的情况下,点击右上角的写博客按钮
&semp;3、存在注销按钮
预期结果:进入博客编辑页面,不应存在注销按钮
实际结果:进入博客编辑页面,存在注销按钮

通过自动化测试发现的bug

这里是通过Edge浏览器使用自动化测试工具测试出来的背景图不显示的问题,此bug不知道为啥,反正以我对bug的判定,应该为一般bug了
在这里插入图片描述
对bug的描述:
次要bug
问题出现的环境:Microsoft Edge浏览器 版本 版本 131.0.2903.51 (正式版本) (64 位)
问题出现的步骤:
&semp;1、打开谷歌浏览器,输入网址 http://8.137.19.140:9090/blog_login.html
&semp;2、默认就会不显示背景图
预期结果:进入博客登录页面,存在背景图
实际结果:进入博客登录页面,不存在背景图

bug标题报告人是否修复
http://8.137.19.140:9090/blog_edit.htmlEdd未修复
http://8.137.19.140:9090/blog_login.htmlEdd未修复

测试总结

本次项目测试通过,项目开发了一个月,项目测试耗时2天时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现

一、编码问题 在计算机编程中,流(Stream)是一种抽象的概念,用于表示数据的输入或输出。根据处理数据的不同方式,流可以分为字节流(Byte Stream)和字符流(Character Stream&#xff0…

Hive基础面试-如何理解复用率的

1. 模型的复用率你们是怎么做的? 简单直白的说就是你的模型复用率如何,在业务方是否认可该模型,也是衡量模型建设的一个标准,复用率数:数仓模型涉及的核心是追求模型的复用和共享,引用系数越高,…

如何使用 Python 开发一个简单的文本数据转换为 Excel 工具

目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件: 读取TSV文件: 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的…

知识中台:提升企业知识管理的智能化水平

在数字化转型的浪潮中,企业知识管理的智能化水平成为提升竞争力的关键。HelpLook知识中台通过集成先进的AI技术,为企业提供了一个智能化的知识管理平台。 一、知识管理智能化的重要性 智能化的知识管理不仅能够提高信息检索的效率,还能通过…

MAC借助终端上传jar包到云服务器

前提:保证工程本地已打包完成:图中路径即为项目的target目录下已准备好的jar包 第一步:打开终端(先不要连接自己的服务器),输入下面的上传命令: scp /path/to/local/app.jar username192.168.1…

生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件

我们知道MPSOC或者ZYNQ的启动文件BOOT.BIN 通常由三最少三部分组成 1,FSBL 第一阶段引导加载器 2,BIT流文件 3,用户APP文件 用户使用这个三个文件生成BOOT.BIN时候往往用SDK的用户界面,分别选择这三个文件之后生成。其实这种方…

【机器学习】——朴素贝叶斯模型

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

html+js实现图片的放大缩小等比缩放翻转,自动播放切换,顺逆时针旋转

效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片预览</title><sty…

数据结构 ——— 快速排序算法的实现(hoare版本)

目录 快速排序的思想 单趟排序逻辑的实现 快速排序算法的实现 快速排序的思想 任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子列中所有元素均小于基准值&#xff0c;右子席列中所有元素均大于基准值&#xff0…

Nmap识别MongoDB 6.0指纹

Nmap识别MongoDB 6.0指纹 朋友反馈一个问题&#xff0c;说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。 如上图所示&#xff0c;对应的VERSION信息是空的&#xff0c;在提示信息中可以看到&#xff0c;官方推荐将指纹信息上传以帮助更新服务指纹&…

论文阅读:A fast, scalable and versatile tool for analysis of single-cell omics data

Zhang, K., Zemke, N.R., Armand, E.J. et al. A fast, scalable and versatile tool for analysis of single-cell omics data. Nat Methods 21, 217–227 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-02139-9 代码地址&#xff1a;https://github.com…

飞凌嵌入式旗下教育品牌ElfBoard与西安科技大学共建「科教融合基地」

近日&#xff0c;飞凌嵌入式与西安科技大学共同举办了“科教融合基地”签约揭牌仪式。此次合作旨在深化嵌入式创新人才的培育&#xff0c;加速科技成果的转化应用&#xff0c;标志着双方共同开启了一段校企合作的新篇章。 出席本次签约揭牌仪式的有飞凌嵌入式梁总、高总等一行…

2024年11月21日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍&#xff1a;正在构建一个由社区支持的现代化Salesforce替代品。项目star数&#xff1a;21,798项目fork数&#xff1a;2,347 项目名称&#xff1a;p…

VSCode汉化教程【简洁易懂】

我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;Microsoft提供&#xff09;Install。 安装完成后选择Change Language and Restart。

Leetcode 生命游戏

以下是上述Java代码的算法思想及其逻辑的中文解释&#xff1a; 算法思想 这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是&#xff1a; 利用原地修改的方式&#xff08;in-place&#xff09;存储下一状态的变化&#xff1a; 通过引入额外的状态值&#xff0…

C++【面试重要题目】 只出现一次的数字的集合.

文章目录 前言一、前提要点补充二、题集总结 前言 本篇笔者将会对 cpp 中比较有意思的类型题目进行细致讲解 . 这类题同时也是面试中比较重要的算法题 , 其算法思想需要学者掌握. 以下题目均来自力扣 一、前提要点补充 ● 几个运用运算符 因为笔者介绍的题目均会用到二进制…

麒麟部署一套NFS服务器,用于创建网络文件系统

一、服务端共享目录 在本例中,kyserver01(172.16.200.10)作为客户端,创建一个目录/testdir并挂载共享目录;kyserver02(172.16.200.11)作为服务端,创建一个共享目录/test,设置为读写权限,要求客户端使用root登录时映射为nobody用户、非root登录时保持不变。 服务端启…

VBA技术资料MF228:移动形状并覆盖某单元格区域

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Python 数据分析核心库大全!

&#xff08;欢迎关注我的视频号&#xff09; &#x1f447;我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299&#xff0c;限时特价2杯咖啡&#xff0c;满100人涨10元。 大家好&#xff01;我是菜鸟哥&#xff01; 今天我们来聊点干货&#xff1a;Python 数据…

跨境出海安全:如何防止PayPal账户被风控?

今天咱们聊聊那些让人头疼的事儿——PayPal账户被风控。不少跨境电商商家反馈&#xff0c;我们只是想要安安静静地在网上做个小生意&#xff0c;结果不知道为什么&#xff0c;莫名其妙账户就被冻结了。 但其实每个封禁都是有原因的&#xff0c;今天就来给大家分享分享可能的原…