HIT的软构课程推荐使用Eclipse编写代码,并且三次实验都默认你使用Eclipse,而像我这样喜欢好看的IDE的人当然会选择用IDEA来编写代码。因此本文会讲述如何在IDEA环境下来完成软构实验的一些内容,并且简单讲述Maven的一些小技巧,以及如何用Travis CI进行在线build。
(使用的IDEA版本为2020.3.3,社区版)
目录
IDEA使用tips
1. 利用集成的Git进行相关操作
事实上,IDEA的功能是强大的,它集成了Git,并且让Git的许多操作变得十分简便易懂。
(关于Git的安装及使用本文不再赘述,B站教程很多,个人推荐尚硅谷)
对于一个新建工程,首先在最上面的一堆菜单选项中找到"VCS",然后点击"Create Git Repository"就可以创建本地仓库。
在创建了Git的本地仓库后,就可以点击IDEA上方的Git栏,看到下图所示界面。
点击Commit,可以将修改好的代码上传到本地仓库;点击Push,可以将本地仓库的代码上传到GitHub。这两个功能是实验中最常用到的功能。
需要注意的是,在第一次push前,需要先设置remotes(即下方的Manage Remotes)。点进去之后,可以创建新的remote。这里remote的名字只是你给URL地址起的一个别名,可以随便起。
在push过程中,我们可以选择将本地仓库的内容推送到一个远程仓库。在软构实验中,就是推送到专门的实验仓库中。
注意,push过程中,你有两个地方可以更改。第一个是你的remote,代表远程仓库的地址,第二个紧跟在remote后面,代表远程仓库的分支名字。通常我们都会推送到master分支上,所以将名字改为master即可。
此外,如果你在自己的实验仓库页面修改了分支名字,比如将初始生成的main分支改为master,那么第一次push很可能失败,因为有可能出现分支合并错误。你可以将分支改回main,再推送一个master;或者在写代码前先将远程仓库pull下来,这样就不会产生分支合并错误。
在今年的实验3中,还需要新建分支。此处直接点击"New Branch"(需要至少commit一次该按钮才会亮起),输入新分支的名字点击创建即可。默认会勾选"Checkout branch",代表新建分支后,自动将头指针移动到该分支。
2. 设置test目录
根据目录要求,你需要在lab工程下创建src和test这两个目录。通常src会在新建工程时自动创建好,而test目录需要我们自己创建,创建好后如下图所示:
但是我们会发现,在test目录下,无法直接像在src目录下那样直接创建一个java文件。此时需要我们更改一些设置:右键工程根文件夹,然后选择“Open Module Settings”。
进入下图所示界面后,右键test目录,将其设置为“Tests”即可,之后你会发现test目录变为了绿色,那就代表设置成功。
设置成功后,你就可以正常地在test目录下添加java文件,来对你的代码进行测试。
(有关Junit的使用方法,网上也有很多教程,此处不再赘述)
3. 测试代码覆盖率
在第二个实验中,会让你用Eclipse中的EclEmma来统计Junit测试用例的代码覆盖度。但在IDEA中你是找不到这个插件的(因为这个插件是为Eclipse设计的),取而代之,你可以找到JaCoCo。但没关系,你可以放心使用,因为EclEmma在2.0版本之后是基于JaCoCo设计的。
在编写完Junit测试代码并点击小绿色箭头测试前,你可以看到这个界面:
为了使用JaCoCo,首先点击最下面的"Modify Run Configuration",进入如下界面:
默认设置都不用动,但你需要选择"Code Coverage"栏右边的那个"Modify"选项,点开如下:
为了选择JaCoCo,你需要勾选"Specify alternative coverage runner"。勾选之后,下方会多出一个选项:
默认选项应该是IntelliJ IDEA,你只需要选为JaCoCo即可。
更改完设置以后,再次点击绿色箭头,选择第三个选项"Run ‘xxx’ with Coverage",之后就会在右边显示相关的覆盖率数据。通常来讲不用过分追求百分百覆盖率,这不现实,也没必要。但是如果覆盖率很低,那就说明你需要重新设计测试代码,尽可能地去让每个函数的每个分支都能被测试到。
IDEA下用Maven构建项目
在课程中,会讲到软件构造的整个流程,其中一步就是Build,也就是构建。而Maven就是一个很棒的构建工具,此外它也是一个依赖管理工具和项目管理工具,能通过配置文件中的依赖关系从中央仓库中下载项目所需的外部库。
由于笔者能力有限,对于Maven的许多功能研究的并不透彻,只能做到抛砖引玉,同时让读者避开一些坑。下面开始讲如何用Maven构建一个项目。
1. 添加Maven框架支持
依旧是右键工程根目录,点击"Add Framework Support"。
之后在界面中勾选Maven,点击OK,就将Maven添加到你的工程中了。
(如果添加之后出现Error reading,点击右边Maven框中的转圈的箭头按钮即可)
添加完之后,我们欣(wu)喜(yu)地发现项目的目录结构变了,同时多出了一个pom.xml配置文件,如下图。
但是!实验手册对目录结构有明确要求,我们不想改变目录结构!
那有人就说了,我不用Maven不就行了!逃避虽然可耻,但有用!
Maven还是要用的,毕竟之后我们还要验证我们的程序是否能脱离本机环境跑起来,而这也是实验手册的要求。毕竟,仅仅能让代码在你的机器上跑起来是不够的!
2. 更改Maven目录结构
让我们先看看目录结构都改变什么了。首先是src目录,原先它是我们代码的根目录,现在代码的根目录变成了src\main\java,而test目录也变成了src\test\java(虽然之前的test目录也能用)。
这其实是Maven约定的目录结构(具体的目录结构可以去网上搜,很多详解)。而我们为了更改目录结构,就不得不打开pom.xml这个配置文件了!
初始时,配置文件里会有如下信息(看不懂就对了,我也看不懂,就能看懂个UTF-8)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
现在我们在其中加上一些信息。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
</build>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
没错,就是多了一段build信息!更新配置文件信息后,你会看到这样一个小框:
直接点击按钮,它会帮你根据更新后的配置信息更改项目结构。让我们看看更新后的目录结构:
src目录又回来了!test目录也回来了!问题成功解决!接下来你就可以把那些与实验无关的文件夹删掉了:
有的人会说,我直接像之前那样更改Module Settings不行吗?答案是否定的,不然我也不会去一个我看不懂的配置文件中去修改信息了2333
现在这个目录结构就符合实验手册的要求了。但是还没完!我们还需要往配置文件里加点信息。
3. 添加Junit4依赖
我们在build项和version项中间加一些依赖关系信息:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
如果不加这个信息,你之后在用Junit4写测试用例时,是无法用maven构建成功的!
如果以后你需要添加别的依赖关系,只需要按照dependency书写的格式,在dependencies中新加一个条目即可。
简单来说,dependency中的这三条信息可以唯一确定一个依赖条目,就像是函数中的一对一映射一样。至于这三条信息具体写什么,可以直接去Maven中央仓库网页(Maven Repository: Search/Browse/Explore (mvnrepository.com))去查找,人家都会给你写好的。
4. 用Maven进行测试
在右侧的Maven菜单中,双击Lifecycle中的test选项,Maven就会自动帮你执行test以前包括test的所有步骤。这里我们是想用Maven帮我们跑测试用例。
之后,我们就会看到一些输出信息,其中就可以看到关于测试用例的信息。
(中间如果出了什么错误信息可以百度,因为我也不知道会遇到什么千奇百怪的错误,我自己也遇到过各种错误,就挺离谱的)
请注意,想要让Maven识别你的测试文件,你需要以一定的格式来命名测试文件,比如xxxTest或者TestXXX。在测试过程中,我发现如果将文件名改成别的(比如单走一个t),Maven就不会输出测试信息。
5. 控制台输出乱码
在刚才测试的过程中,如果你输出了一些中文信息,可能会出现乱码的情况!如果出现乱码,请试一试如下的解决方案(不保证百分百好用,不好用还可以继续百度)
如下图,修改pom.xml中的properties信息,新加两行。
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<argLine>-Dfile.encoding=UTF-8</argLine>
</properties>
至此关于Maven的一些使用方法就讲完了,由于笔者能力有限,如有错误,恳请斧正!
如何用Travis CI进行在线build
其实本来可以不用Maven来如此费力的构建项目的(过程中还会出现许多莫名其妙的错误毁心态)。
不过一方面,如果想从走软构方向,这些东西是一定要会的,另一方面就是,Maven是我们接下来用Travis CI进行在线build的基础。
有关Travis CI如何注册、使用的方法,可以自行百度,教程多得很。接下来我们只是讲解如何用它在线build一个Java项目。
其实很简单,首先你需要在根目录下新建一个yml类型的文件——.travis.yml
(注意,travis前面还有一个点)
然后复制如下代码:
language: java
jdk: openjdk8
branches: master
install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true
script: mvn test
(如果你是手写,请务必记住,每一个条目的冒号后面都有一个空格!这是语法要求!不添加空格会识别不了相关信息)
其中,language条目说明了你的代码使用的是什么语言;jdk条目说明了你的jdk版本(比如jdk 8);branches条目说明了从GitHub仓库上的哪个分支去找代码;script条目相当于一个脚本,说明了要执行的命令,比如"mvn test"(就是上一节中的用Maven跑测试代码的命令)
(至于install那个命令我也不知道什么意思,实在是能力有限)
之后你只需要把这个文件和仓库里的其他文件一起push到仓库中就可以了!Travis CI会很聪明地找到这个文件,然后开始根据这个文件帮你在线Build。如果你的项目在本机上可以用Maven成功构建,那么大概率在线build也不会出问题。
在等待10多秒之后,Travis CI就会提示你build成功,同时输出一些日志信息,在这里你同样可以看到测试信息(下图只截取成功时的部分画面,测试代码背景是本课程的lab2)
至此,你已经成功地让自己的项目脱离本机环境运行起来了,可喜可贺!
总结
以上就是我在用IDEA进行软构实验中的一些小心得(和踩坑体验),希望能让学弟学妹少踩一些坑!当然,这篇文章并不是一篇保姆级教学,因此一些基础知识仍然需要在网上搜索资料,自行学习(这也是对能力的一种锻炼)。希望对你们有帮助!