网页版五子棋的自动化测试

目录

前言

一、主要技术

二、测试环境的准备部署

三、测试用例

四、执行测试

4.1、公共类设计

创建浏览器驱动对象

测试套件

释放驱动类

4.2、功能测试

登录页面

注册页面

游戏大厅页面

游戏房间页面

测试套件结果 

4.3、界面测试

登录页面

注册页面

游戏大厅页面

游戏房间页面


前言

        在五子棋对战项目的基础上进行自动化测试,已知此项目由用户模块、匹配模块、对战模块构成。用户模块包含用户的注册和登录,管理用户的天梯分数、比赛场数、获胜场数等信息;匹配模块包含依据用户的天梯积分,实现匹配机制;对战模块包含把两个匹配到的玩家放到一个游戏房间中,对方通过网页的形式来进行对战比赛。

        整体对项目进行自动化测试分为设计测试用例和进行测试两方面

一、主要技术

        整体测试流程主要涉及谷歌浏览器驱动 ChromeDriver + 自动化测试工具selenium4 + 单元测试框架Junit5。

selenium是一款开源免费的web自动化测试工具,支持多浏览器,支持多系统,支持多语言,而且其中提供了很多可供测试的API,使用十分便捷。

JUnit是一款Java单元测试的工具,用于优化我们的自动化脚本。

二、测试环境的准备部署

在pom导入要依赖的包

        <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.10.0</version></dependency><!--保存屏幕截图文件所要用到的包        --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency>

三、测试用例

四、执行测试

4.1、公共类设计

创建浏览器驱动对象

由于每次测试都需要创建一个浏览器驱动对象造成资源和时间的浪费,所以可以创建一个公共类用来创建浏览器驱动对象

public class AutotestUtils {public static ChromeDriver chromeDriver;public static EdgeDriver edgeDriver;//创建驱动对象public static ChromeDriver createChromeDriver(){//驱动创建好了、没有创建if (chromeDriver==null){ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");chromeDriver=new ChromeDriver(options);//隐式等待Duration duration = Duration.ofSeconds(10);long millis = duration.toMillis();chromeDriver.manage().timeouts().implicitlyWait(millis, TimeUnit.MILLISECONDS);}return chromeDriver;}public static EdgeDriver createEdgeDriver(){//驱动创建好了、没有创建if (edgeDriver==null){EdgeOptions options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");edgeDriver=new EdgeDriver(options);//隐式等待edgeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}return edgeDriver;}
}

测试套件

使用suite测试套件来进行测试,指定类来运行用例

@Suite
@SelectClasses({LoginFunctionTest.class, driverQuitTest.class})
public class runSuite {
}

释放驱动类

单独写一个释放驱动类

public class driverQuitTest extends AutotestUtils {public static ChromeDriver chromeDriver;public static EdgeDriver edgeDriver;@Teststatic void driverQuit(){if (chromeDriver!=null){chromeDriver.quit();}else if (edgeDriver!=null){edgeDriver.quit();}else {chromeDriver.quit();edgeDriver.quit();}}
}

4.2、功能测试

登录页面

首先定义浏览器对象和url

    public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl(){chromeDriver.get("http://49.232.185.203:9999/login.html");}

测试错误的用户名和密码

    /*** 测试用户名或者密码错误*/@ParameterizedTest@CsvSource({"baekhyun,1999","bb,1993"})@Order(1)void testLoginErrorUser(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);//登录失败的结果进行检测String except="登录失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试用户名为空

    /*** 测试空的用户名*/@Order(2)@ParameterizedTest@CsvSource({",1999",",1993"})void testLoginNullUser(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();if (password!=null){chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);}chromeDriver.findElement(By.cssSelector("#submit")).click();//等待一秒钟Thread.sleep(1000);//登录失败的结果进行检测String except="登录失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试密码为空

    /*** 测试空的密码* @param username* @param password* @throws InterruptedException*/@Order(3)@ParameterizedTest@CsvSource({"baekhyun,","bb,"})void testLoginNullPassword(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();if (username!=null){chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);}chromeDriver.findElement(By.cssSelector("#submit")).click();//等待一秒钟Thread.sleep(1000);//登录失败的结果进行检测String except="登录失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试用户名或密码出现特殊符号

    /*** 测试特殊字符*/@Order(4)@ParameterizedTest@CsvSource({"$^*(,1999","krystal,#^&**((*"})void testLoginPartUser(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);chromeDriver.findElement(By.cssSelector("#submit")).click();//等待一秒钟Thread.sleep(1000);//登录失败的结果进行检测String except="登录失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

检测多开是否能正常登录

    /*** 测试多开*/@Order(5)@Testvoid testTwoUser() throws InterruptedException {edgeDriver.get("http://49.232.185.203:9999/login.html");//使用隐式等待渲染页面完成edgeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(18));edgeDriver.findElement(By.cssSelector("#username")).clear();edgeDriver.findElement(By.cssSelector("#password")).clear();edgeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");edgeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");edgeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);Alert alert2=edgeDriver.switchTo().alert();alert2.accept();edgeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);Alert alert3=chromeDriver.switchTo().alert();alert3.accept();Thread.sleep(1000);String except="当前检测到了多开,请使用其他账号登录!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();Assertions.assertEquals(except,actual);Thread.sleep(1000);alert.accept();edgeDriver.quit();}

测试正确的用户名和密码

    /*** 测试正确登录*/@Order(5)@ParameterizedTest@CsvSource({"baekhyun,1992"})void testLoginSuccess(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);chromeDriver.findElement(By.cssSelector("#submit")).click();//等待一秒钟Thread.sleep(1000);//登录失败的结果进行检测String except="登录成功!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试结果:

注册页面

首先定义浏览器对象和url

    /*** 1、浏览器对象* 2、访问登录页面的url*/public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl(){chromeDriver.get("http://49.232.185.203:9999/register.html");}

测试空的用户名

    /*** 测试空的用户名* @param username* @param password* @throws InterruptedException*/@Order(1)@ParameterizedTest@CsvSource({",1999"})public void testRegisterNullUsername(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();if (password!=null){chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);}chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);String except="注册失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试空的密码

    /*** 测试空的密码* @param username* @param password* @throws InterruptedException*/@Order(2)@ParameterizedTest@CsvSource({"hahaha,"})public void testRegisterNullPassword(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();if (username!=null){chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);}chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);String except="注册失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试用户已存在

    /*** 测试用户已存在*/@Order(3)@ParameterizedTest@CsvSource({"baekhyun,1933"})public void testRegisterUserExit(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);String except="注册失败!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试用户名或密码中含有特殊字符

    /*** 测试用户名或密码中含有特殊字符*/@Order(4)@ParameterizedTest@CsvSource({"%^^&*^*,1999","bakkk,%&&*&*&("})public void testRegisterPartUser(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);String except="注册成功!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();chromeDriver.navigate().back();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试正常注册

    /*** 测试正常注册*/@Order(5)@ParameterizedTest@CsvSource({"ccc,199923"})public void testRegisterSuccess(String username,String password) throws InterruptedException {try {chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);String except="注册成功!";Alert alert=chromeDriver.switchTo().alert();String actual=alert.getText();System.out.println("alert:"+actual);Assertions.assertEquals(except,actual);alert.accept();}catch (NoAlertPresentException e){System.out.println("没有发现警告窗!");}catch (UnhandledAlertException e){System.out.println("警告窗文本与预期不符合!");}}

测试结果:

游戏大厅页面

首先定义浏览器对象和url

    /*** 1、浏览器对象* 2、访问登录页面的url*/public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl() throws InterruptedException {chromeDriver.get("http://49.232.185.203:9999/login.html");//使用隐式等待渲染页面完成chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(18));chromeDriver.findElement(By.cssSelector("#username")).clear();chromeDriver.findElement(By.cssSelector("#password")).clear();chromeDriver.findElement(By.cssSelector("#username")).sendKeys("baekhyun");chromeDriver.findElement(By.cssSelector("#password")).sendKeys("1992");chromeDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);Alert alert=chromeDriver.switchTo().alert();alert.accept();chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}

测试登录状态下,按钮能否正常点击并且文字变为匹配中

    /*** 测试登录状态下,按钮能否正常点击并且文字变为匹配中*/@Testvoid testButton() throws InterruptedException {Thread.sleep(1000);String word=chromeDriver.findElement(By.cssSelector("#match-button")).getText();Assertions.assertEquals(word,"开始匹配");Thread.sleep(1000);chromeDriver.findElement(By.cssSelector("#match-button")).click();//强制等待Thread.sleep(1000);word=chromeDriver.findElement(By.cssSelector("#match-button")).getText();Assertions.assertEquals(word,"匹配中...(点击停止)");}

测试再次点击之后文字是否变为开始匹配

    /*** 测试再次点击后文字是否变为开始匹配*/@Order(2)@Testvoid testButton2() throws InterruptedException {Thread.sleep(1000);String word=chromeDriver.findElement(By.cssSelector("#match-button")).getText();Assertions.assertEquals(word,"匹配中...(点击停止)");Thread.sleep(1000);chromeDriver.findElement(By.cssSelector("#match-button")).click();//强制等待Thread.sleep(1000);word=chromeDriver.findElement(By.cssSelector("#match-button")).getText();Assertions.assertEquals(word,"开始匹配");}

测试两个用户点击匹配是否能匹配成功

    /*** 测试两个用户点击匹配是否能匹配成功*/@Testvoid jionSuccess() throws InterruptedException {chromeDriver.findElement(By.cssSelector("#match-button")).click();edgeDriver.findElement(By.cssSelector("#match-button")).click();Thread.sleep(1000);String url1=chromeDriver.getCurrentUrl();String url2= edgeDriver.getCurrentUrl();Assertions.assertEquals("http://49.232.185.203:9999/game_room.html",url1);Assertions.assertEquals("http://49.232.185.203:9999/game_room.html",url2);}

测试结果:

游戏房间页面

检测下棋过程中是否有提示语

    /*** 测试下棋过程中是否有提示语*/@Testvoid testGameRoomText() throws InterruptedException {chromeDriver.findElement(By.cssSelector("#match-button")).click();edgeDriver.findElement(By.cssSelector("#match-button")).click();Thread.sleep(1000);String text1=chromeDriver.findElement(By.cssSelector("#screen")).getText();String text2=edgeDriver.findElement(By.cssSelector("#screen")).getText();System.out.println(text1);System.out.println(text2);if (text1.equals("轮到你落子了!")){Assertions.assertEquals(text1,"轮到你落子了!");}else {Assertions.assertEquals(text1,"轮到对方落子了!");}if (text2.equals("轮到你落子了!")){Assertions.assertEquals(text2,"轮到你落子了!");}else {Assertions.assertEquals(text2,"轮到对方落子了!");}}

测试结果:

测试套件结果 

4.3、界面测试

登录页面

首先定义浏览器对象和url

    /*** 1、浏览器对象* 2、访问登录页面的url*/public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl(){chromeDriver.get("http://49.232.185.203:9999/login.html");}

测试提交用户登录标题

    /*** 测试用户登录标题*/@Testvoid testDenglu(){String loginText=chromeDriver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText();Assertions.assertEquals(loginText,"登录");}

测试登录用户名输入框

    /*** 测试用户名输入框*/@Testvoid testUserInput(){WebElement webElement=chromeDriver.findElement(By.cssSelector("#username"));Assertions.assertNotNull(webElement);}

测试登录密码输入框

    /*** 测试密码输入框*/@Testvoid testPasswordInput(){WebElement webElement=chromeDriver.findElement(By.cssSelector("#password"));Assertions.assertNotNull(webElement);}

测试登录提交按钮

    /*** 测试提交按钮*/@Testvoid testSubmit(){WebElement webElement=chromeDriver.findElement(By.cssSelector("#submit"));Assertions.assertNotNull(webElement);}

测试登录提交按钮的文字

    /*** 测试提交按钮的文字*/@Testvoid testSubmitText(){String submitText=chromeDriver.findElement(By.cssSelector("#submit")).getText();Assertions.assertEquals(submitText,"提交");}

测试结果:

注册页面

首先定义浏览器对象和url

    /*** 1、浏览器对象* 2、访问登录页面的url*/public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl(){chromeDriver.get("http://49.232.185.203:9999/register.html");}

测试用户注册标题

    /***测试用户注册标题*/@Testvoid testRegister(){String registerText=chromeDriver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText();Assertions.assertEquals(registerText,"注册");}

测试注册用户名输入框

    /*** 测试用户名输入框*/@Testvoid testUserInput(){WebElement webElement=chromeDriver.findElement(By.cssSelector("#username"));Assertions.assertNotNull(webElement);}

测试注册密码输入框

    /*** 测试密码输入框*/@Testvoid testPasswordInput(){WebElement webElement=chromeDriver.findElement(By.cssSelector("#password"));Assertions.assertNotNull(webElement);}

测试注册提交按钮

    /*** 测试提交按钮*/@Testvoid testSubmit(){WebElement webElement=chromeDriver.findElement(By.cssSelector("#submit"));Assertions.assertNotNull(webElement);}

测试注册提交按钮文字

    /*** 测试提交按钮的文字*/@Testvoid testSubmitText(){String submitText=chromeDriver.findElement(By.cssSelector("#submit")).getText();Assertions.assertEquals(submitText,"提交");}

测试结果:

游戏大厅页面

首先定义浏览器对象和url

    /*** 1、浏览器对象* 2、访问登录页面的url*/public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl(){chromeDriver.get("http://49.232.185.203:9999/game_hall.html");}

测试匹配按钮

    /*** 测试按钮*/@Testvoid testButton(){WebElement button=chromeDriver.findElement(By.cssSelector("#match-button"));Assertions.assertNotNull(button);}

测试匹配按钮上的文字

    /*** 测试按钮上的文字*/@Testvoid testButtonText(){String buttonText=chromeDriver.findElement(By.cssSelector("#match-button")).getText();Assertions.assertEquals(buttonText,"开始匹配");}

测试导航栏

    /*** 测试导航栏*/@Testvoid testNav(){WebElement nav=chromeDriver.findElement(By.cssSelector("body > div.nav"));Assertions.assertNotNull(nav);}

测试导航栏上的文字

    /*** 测试导航栏上的文字*/@Testvoid testNavText(){String navText=chromeDriver.findElement(By.cssSelector("body > div.nav")).getText();Assertions.assertEquals(navText,"五子棋对战");}

测试用户信息块 

    /*** 测试用户信息块*/@Testvoid testUserInfo(){WebElement screen=chromeDriver.findElement(By.cssSelector("#screen"));Assertions.assertNotNull(screen);}

测试结果:

游戏房间页面

首先定义浏览器对象和url

    /*** 1、浏览器对象* 2、访问登录页面的url*/public static ChromeDriver chromeDriver=createChromeDriver();@BeforeAllstatic void baseControl(){chromeDriver.get("http://49.232.185.203:9999/game_room.html");}

测试棋盘

    /*** 测试棋盘*/@Testvoid testChess(){WebElement chess=chromeDriver.findElement(By.cssSelector("#chess"));Assertions.assertNotNull(chess);}

测试导航栏

    /*** 测试导航栏*/@Testvoid testNav(){WebElement nav=chromeDriver.findElement(By.cssSelector("body > div.nav"));Assertions.assertNotNull(nav);}

测试导航栏上的文字

    /*** 测试导航栏上的文字*/@Testvoid testNavText(){String navText=chromeDriver.findElement(By.cssSelector("body > div.nav")).getText();Assertions.assertEquals(navText,"五子棋对战");}

测试提示语框

    /*** 测试提示语框*/@Testvoid testScreen(){WebElement screen=chromeDriver.findElement(By.cssSelector("#screen"));Assertions.assertNotNull(screen);}

测试结果:

总结:目前针对网页版五子棋的测试如上述博客,由于部分用例无法进行自动化测试,所以进行相应的人工测试,且测试通过

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python如何单步调试

Python怎么单步调试&#xff1f;下面给大家介绍一下单步调试&#xff1a; 方法一&#xff1a;执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试&#xff0c;这时你能够看看帮助。 方法二&#xff1a;在所调试程序的开头中&#xff1a;import pdb 并在你…

Vue入门到关门之Vue3学习

一、常用API 注意&#xff1a;本文项目均使用脚手架为 Vite 1、setup函数 &#xff08;1&#xff09;介绍 如果在项目中使用配置项API&#xff0c;那么写起来就和vue2的写法是一样的&#xff1b;但是如果在项目中写的是组合式API&#xff0c;那么组件中所用到的&#xff1a…

电脑提示找不到ffmpeg.dll无法继续执行代码怎么办?

电脑提示找不到找不到ffmpeg.dll无法继续执行代码怎么办&#xff0c;有什么好的解决办法&#xff0c;出现这样的弹出就会导致软件无法打开或者是异常关闭&#xff0c;找不到dll文件&#xff0c;是一个非常重要的电脑使用问题&#xff0c;会给使用者带来许多的麻烦。那么找不到d…

PyWebIO,用 Python 写网站

在Python的世界里&#xff0c;PyWebIO是一个简单而强大的库&#xff0c;它能让你的Python脚本快速拥有一个交互式的网页界面。想象一下&#xff0c;你不需要懂得前端开发&#xff0c;就能创建出用户友好的网页应用&#xff0c;这是多么酷的一件事&#xff01;今天&#xff0c;我…

uni-app条件编译和网页打包

在项目打包时&#xff0c;存在打包微信小程序、h5网页端或者其他平台小程序的情况&#xff0c;但是有些api是某些小程序中特有的&#xff0c;例如wx.requestPayment()&#xff0c;微信支付、授权等功能。 这时&#xff0c;若不做条件编译&#xff0c;打包成非微信小程序的项目…

新闻资讯微信小程序开发后端+php【附源码,文档说明】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

1694jsp宿舍管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 宿舍管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库…

气膜建筑送风装置特点是什么样的—轻空间

气膜建筑作为一种新型建筑结构&#xff0c;其送风装置在保证建筑内部空气压力和稳定性方面发挥着至关重要的作用。以下是对气膜建筑送风装置特点的详细介绍&#xff1a; 1. 提供稳定内压&#xff1a; 气膜建筑的送风装置利用送风形成内部压力&#xff0c;赋予建筑物必要的刚度和…

0506libMaven项目

0506libMaven项目包-CSDN博客 数据库字段 界面需求

极氪速度:70亿市值登陆纽交所,这家纯电豪华品牌开启弹射模式

作者 |老缅 编辑 |德新 北京时间5月10日晚&#xff0c;极氪智能科技在美国纽交所挂牌上市&#xff0c;股票代码为「ZK」。 因获超额认购&#xff0c;极氪扩大了IPO规模&#xff0c;以每股21美元的价格累计发行2100万股美国存托股票&#xff08;每份ADS 对应 10 份普通股&…

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词&#xff0c;近些年被玩坏了&#xff0c;共享单车,共享充电宝,共享办公室&#xff0c;共享雨伞… 甚至还有共享女朋友&#xff0c;真是人有多大胆&#xff0c;共享有多大产。但凡事太尽就容易恶心到人&#xff0c;自己也一度被 共享内存 恶心到了&am…

【Python贪吃蛇】:编码技巧与游戏设计的完美结合

文章目录 &#x1f525;一、运行效果&#x1f4a5;二、游戏教程✈1. 导入模块❤️2. 初始化游戏元素☔3. 改变蛇移动的方向&#x1f44a;4. 绘制方块&#x1f680;5. 检查蛇头是否在游戏区域内&#x1f308;6. 定义蛇的移动函数&#x1f3ac;7. 绑定键盘事件 ⭐三、完整代码 &a…