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

目录

前言

一、主要技术

二、测试环境的准备部署

三、测试用例

四、执行测试

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.mzph.cn/diannao/11464.shtml

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

相关文章

MoonBit 本周有重磅更新!枚举构造器支持可变字段、数组字面量默认构建 Vector

MoonBit更新 支持了构造器的 payload 中出现 mutable field&#xff0c;使用方式如下&#xff1a; enum E {C(mut ~x : Int, mut ~y : Int) } derive(Debug)fn swap_xy(x : E) -> Unit {match x {// ~y 会绑定模式匹配前 C 中的 y 字段的值// 当看到 C(..) as c 这种模式时…

visual sudio使用-创建空项目-创建cpp文件

新建空项目 新建cpp文件 #include <iostream> using namespace std;int main() {cout << "hello vs" << endl;cout << "hello c" << "\n";cout << "hello first day\n"; }

LeetCode416:分割等和子集

题目描述 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 解题思想 [1,5,11,5] 和为22&#xff0c;其中一半为 11。如果能寻找到若干数的和为11则成立可以抽象为一个0-1背包问题&#xff1a;容…

MATLAB绘制蒸汽压力和温度曲线

蒸汽压力与温度之间的具体关系公式一般采用安托因方程&#xff08;Antoine Equation&#xff09;&#xff0c;用于描述纯物质的蒸汽压与温度之间的关系。安托因方程的一般形式如下&#xff1a; [\log_{10} P A - \frac{B}{C T}] 其中&#xff0c; (P) 是蒸汽压&#xff08…

【刷题】一篇文章搞定“位运算”

只要春天不死&#xff0c;就有迎春的花朵年年岁岁开放&#xff0c;生命讲涅槃&#xff0c;生生不息&#xff0c;并会以另一种形式永存。 – 路遥 《平凡的世界》 (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥ (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥…

NL6621 WIFI模块烧录及其他

某宝淘得NL6621: 测了一下引脚&#xff1a; 做了以下功课&#xff1a; 新岸线物联网NL6621解决方案是高性价比、完全开源、高成熟度的解决方案&#xff0c;特别为高数据吞吐率低成本的无线局域网产品而设计。它集成了MCU&#xff0c; MAC&#xff0c;1T1R基带和带功放RF收发机于…

数据结构的二叉树(c语言版)

一.二叉树的概念 1.二叉树的基本概念 二叉树是一种常见的树状数据结构&#xff0c;它由若干个节点组成&#xff0c;这些节点通过边连接起来。每个节点最多可以有两个子节点&#xff0c;分别称为左子节点和右子节点。 二叉树的特点是每个节点最多有两个子节点&#xff0c;而且…

Eplan2.9版本安装教程指南【附安装包】

文章目录 前言一、Eplan是什么&#xff1f;二、安装指南1、安装包获取2、安装步骤在这里插入图片描述 总结 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 提示&…

【报错合集】完美解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”

文章目录 解决方案&#xff1a;更改设置的硬件版本 今天我需要将别人的虚拟机克隆到我的VMware Workstation上运行&#xff0c;结果发生了以下的错误&#xff1a; 刚开始以为是VMware Workstation的版本问题太低导致的&#xff0c;所以我删除了原来的那个版本&#xff0c;下载…

开源分布式爬虫管理平台:性能强悍!!【送源码】

简介 基于 Golang 的分布式爬虫管理平台&#xff0c;支持 Python、NodeJS、Go、Java、PHP 等多种编程语言以及多种爬虫框架。 谁适合使用 Crawlab? 网路爬虫工程师&#xff1a; 通过集成爬虫程序到 Crawlab&#xff0c;网路爬虫工程师可以聚焦于爬虫的核心解析逻辑&#xff0…

WCF 双工 回调模式

wcfInterface 项目 》》》wcf服务端提供的服务协议 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace wcfInterface {[ServiceContract(CallbackContract typeo…

【软考网络工程师】每日练题学知识

1.在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是&am…

鸿蒙内核源码分析(工作模式篇) | CPU的七种工作模式

本篇说清楚CPU的工作模式 工作模式(Working mode) 也叫操作模式&#xff08;Operating mode&#xff09;又叫处理器模式&#xff08;Processor mode&#xff09;&#xff0c;是 CPU 运行的重要参数&#xff0c;决定着处理器的工作方式&#xff0c;比如如何裁决特权级别和报告异…

实时追踪维修进度,报修管理小程序让你省心又省力!

随着生活、工作节奏的日益加快&#xff0c;日常的售后报修、故障报修处理流程给我们带来种种困扰。我们都知道大多数企业、个人用户还在使用传统报修方式&#xff0c;如电话报修、纸质报修单等方式&#xff0c;不仅效率低下&#xff0c;而且难以追踪维修进度&#xff0c;给我们…

AI游戏外挂为何违法?

尊敬的读者们&#xff0c;大家好&#xff01;今天我想和大家探讨一个备受争议的话题——AI游戏外挂的合法性。近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI外挂逐渐成为游戏领域的一大毒瘤。那么&#xff0c;为什么AI游戏外挂会被视为违法行为呢&#xff1f;本…

【中级软件设计师】上午题16-算法(应试考试简略版)

上午题16-算法 1 回溯法1.1 n皇后问题 2 分治法3 动态规划3.1 0-1背包问题3.2 最长公共子序列3.3 矩阵连乘 4 贪心算法5 分支限界法总结 1 回溯法 深度优先方法搜索 1.1 n皇后问题 2 分治法 一般来说&#xff0c;分治算法在每一层递归上都有3个步骤 &#xff08;1&#xff…

C++——缺省参数与重载函数

目录 ​前言 一.缺省参数 1.1缺省参数概念 1.2缺省参数分类 注意事项&#xff1a; 二.函数重载 2.1函数重载概念 2.2c支持函数重载原理——命名修饰 前言 本篇文章主要讲述c中有关于缺少参数与函数重载的相关概念与实例&#xff0c;以下是本人拙见&#xff0c;如有错误…

【Linux学习笔记】一篇文章彻底搞定“Linux生产者与消费者“!

本章重点 1.生产者消费者模型2.posix信号量&#xff0c;以及读写锁。3. 理解基于读写锁的读者写者问题。 一. 生产者消费者模型 为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0…

专业音频修复软件:iZotope RX 11 for Mac 激活版

iZotope RX 专为满足后期制作专业人士的苛刻需求而设计的一款专业音频修复软件。iZotope RX 10添加了新的特性和功能&#xff0c;以解决当今后期项目中存在的一些最常见的修复问题&#xff0c;使其成为音频后期制作的最终选择。虽然包含许多其他新功能&#xff0c;但这里是新的…

微信小程序的设计与实现

微信小程序的设计与实现 目录 1.系统简述&#xff1a; 2.开发工具及相关技术&#xff1a; 2.1 HTML、WXSS、JAVASCRIPT技术 2.2 Vanilla框架 2.3 uni-app框架 2.4 MYSQL数据库 3.工程结构及其说明&#xff1a; 4.主要功能展示 4.1登录 4.2 注册 4.3 首页…