- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我正在创建规则,该规则应该检查方法是否包含 @Test 和 @TestInfo 注释。如果确实如此,@TestInfo 不应有空参数 testCaseId。
有几种不同的可能方法来填充 testCaseId。示例:
@Test
@TestInfo(testCaseId = { "ABC-123", "DEF-154" }, component = "Component")
public int foo() {
return 0;
}
@Test
@TestInfo(testCaseId = ("ABC-123"), component = "Component")
public int foo() {
return 0;
}
@Test
@TestInfo(testCaseId = "ABC-123", component = "Component")
public int foo() {
return 0;
}
我已经涵盖了 @TestInfo 不存在、没有 testCaseId 参数或 testCaseId 等于“”的情况。
但我发现很难找到如何获取 testCaseId 的整个值。
这就是我找到论据的方式:
Arguments arguments = annotationTree.arguments();
if (!arguments.isEmpty()) {
for (int i = 0; i < arguments.size(); i++) {
checkArgument(arguments.get(i));
}
}
if (!annotationsContainsTestCaseId) {
reportIssue(arguments, "Method annotated with @TestInfo should have not empty testCaseId parameter");
}
private void checkArgument(ExpressionTree argument) {
String parameter = argument.firstToken().text();
String parameterValue = argument.lastToken().text();
if (isParameterTestCaseId(parameter)) {
annotationsContainsTestCaseId = true;
if (isTestCaseIdEmpty(parameterValue)) {
reportIssue(argument, "Method annotated with @TestInfo should have not empty testCaseId parameter");
}
}
}
private boolean isParameterTestCaseId(String parameter) {
return parameter.matches("testCaseId");
}
private boolean isTestCaseIdEmpty(String parameterValue) {
// if "" is empty, length is 2
return parameterValue.length() == 2;
}
但是当testCaseId在{}的()中时,lastToken.text()只返回)或}。
有没有办法获取 () 或 {} 内的参数值?
最佳答案
我明白了。我改用 FileScannerContext。首先我检查方法是否用@Test和@TestInfo注释,然后获取@TestInfo位于哪一行。后来它只是在字符串行中找到我需要的东西。
这是我最终的工作解决方案:
private static final String TEST_ANNOTATION_PATH = "org.testng.annotations.Test";
private static final String TEST_INFO_ANNOTATION_PATH = "toolkit.utils.TestInfo";
private static final String REPORT_EMPTY_TEST_CASE_ID = "Method annotated with @TestInfo should have not empty testCaseId parameter";
private static final String REPORT_MISSING_TEST_INFO = "Method annotated with @Test should also be annotated with @TestInfo";
private static final String TEST_CASE_ID_SPLIT_PLACE = "testCaseId=";
private int methodStartLine = 0;
private int methodEndLine = 0;
private int annotationLine;
private String annotationLineText;
@Override
public List<Tree.Kind> nodesToVisit() {
return ImmutableList.of(Tree.Kind.METHOD, Tree.Kind.ANNOTATION);
}
@Override
public void visitNode(Tree tree) {
if (tree.is(Tree.Kind.METHOD)) {
MethodTree methodTree = (MethodTree) tree;
scanMethodTree(methodTree);
} else if (tree.is(Tree.Kind.ANNOTATION)) {
AnnotationTree annotationTree = (AnnotationTree) tree;
scanAnnotationTree(annotationTree);
}
}
private void scanMethodTree(MethodTree methodTree) {
if (methodTree.symbol().metadata().isAnnotatedWith(TEST_ANNOTATION_PATH)) {
if (methodTree.symbol().metadata().isAnnotatedWith(TEST_INFO_ANNOTATION_PATH)) {
methodStartLine = methodTree.firstToken().line();
methodEndLine = methodTree.lastToken().line();
} else {
reportIssue(methodTree.simpleName(), REPORT_MISSING_TEST_INFO);
}
}
}
private void scanAnnotationTree(AnnotationTree annotationTree) {
if (annotationTree.symbolType().fullyQualifiedName().equals(TEST_INFO_ANNOTATION_PATH)) {
annotationLine = annotationTree.firstToken().line();
if (annotationLine >= methodStartLine && annotationLine < methodEndLine) {
annotationLineText = context.getFileLines().get(annotationLine - 1).replaceAll("\\s", "");
if (annotationLineText.contains("testCaseId")) {
// {"ABC-123","DEF-456"} OR {("ABC-123"), ("DEF-456")}
if ((annotationLineText.contains("{(\"") || annotationLineText.contains("{\""))
&& (annotationLineText.contains("\")}") || annotationLineText.contains("\"}"))) {
reportCase1();
}
// ("ABC-123")
else if (annotationLineText.contains("(\"") && annotationLineText.contains("\")")) {
reportCase2();
}
// "ABC-123"
else if (annotationLineText.contains("\"") && annotationLineText.contains("\",")) {
reportCase3();
}
} else {
addIssue(annotationLine, REPORT_EMPTY_TEST_CASE_ID);
}
}
}
}
/**
* Method report an issue if testCaseId = {"ABC-123","DEF-456",...,"AEF-159"} or
* testCaseId = {("ABC-123"),("DEF-456"),...,("AEF-159")} has no values between
* quotes.
*/
private void reportCase1() {
String testCaseId = annotationLineText.split(TEST_CASE_ID_SPLIT_PLACE)[1].split("}")[0];
testCaseId = testCaseId.replaceAll("\"", "").replaceAll("\\{", "").replaceAll(",", "").replaceAll("\\(", "")
.replaceAll("\\)", "");
if (testCaseId.length() == 0) {
addIssue(annotationLine, REPORT_EMPTY_TEST_CASE_ID);
}
}
/**
* Method report an issue if testCaseId = ("ABC-123") has no value between
* quotes.
*/
private void reportCase2() {
String testCaseId = annotationLineText.split(TEST_CASE_ID_SPLIT_PLACE)[1].split("\"\\)")[0];
testCaseId = testCaseId.replaceAll("\"", "").replaceAll("\\(", "").replaceAll(",", "");
if (testCaseId.length() == 0) {
addIssue(annotationLine, REPORT_EMPTY_TEST_CASE_ID);
}
}
/**
* Method report an issue if testCaseId = "ABC-123" has no value between quotes.
*/
private void reportCase3() {
String testCaseId = annotationLineText.split(TEST_CASE_ID_SPLIT_PLACE)[1].split("\",")[0];
testCaseId = testCaseId.replaceAll("\"", "").replaceAll(",", "");
if (testCaseId.length() == 0) {
addIssue(annotationLine, REPORT_EMPTY_TEST_CASE_ID);
}
}
关于java - SonarQube 参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54250794/
SELECT ID, AppID, Description, Min([Transaction Date]) AS TransactionDate FROM AppProsHist WHERE [De
目前我正在创建规则,该规则应该检查方法是否包含 @Test 和 @TestInfo 注释。如果确实如此,@TestInfo 不应有空参数 testCaseId。 有几种不同的可能方法来填充 testC
是否可以设置参数值,使其在 where 子句中始终结果为 true? 作为示例,考虑一个查询: SELECT name FROM student WHERE class=@parameter; 现在我
我是 JPA 的新手,这是我的查询之一,我有几个参数作为查询的一部分,任何参数都可以为空值 @Query(value = "SELECT ord.purchaseOrderNumber,ord.sal
LOD 参数对 texturelod 取什么值? ?我发现的规范根本没有提到它。它是百分比还是带有百分比的索引值。如果是后者,有没有办法获得纹理具有的 mipmap 数量,以便我能够使用百分比? 最佳
我希望此代码替换现有的 URL 参数“aspid”,但它的作用是在现有的 id 上添加另一个 id。有人可以帮忙吗? $(document).ready(function() { function
在 Spring-boot 项目中,我尝试将 Date 对象作为请求参数传递,并收到此错误: Parameter value [1] did not match expected type [java
在我们的 Jenkinsfile 中,我们有很多参数(参数化构建),在这种情况下,我想检查每个参数是否已切换并对其进行操作。这些参数具有相似的名称,但以不同的小数结尾,因此我想迭代它们以实现此目的。
我的模板之一中有类似于以下内容的内容: 但是 Freemarker 不高兴并给了我: Exception in thread "main" freemarker.core.ParseExceptio
我正在从表单向重定向 servlet 发送一个 post 请求。然后,Servlet 将表单写入其响应 (getWriter) 对象。该表单包含许多隐藏字段。我使用 javascript 提交此表单(
我正在创建一个 JavaScript 组件,我正在根据 jQuery 结果创建该组件的实例,但是,我传递到构造函数中的 DOM 元素虽然在我单步执行调用代码中的循环时已填充,但在传递给构造函数时是未定
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我对 javascript 有疑问。 假设我有这样的 javascript 函数: function show_popup(id) { alert(id); } 编
我目前正在尝试抓取嵌入式 m3u8 url 路径以进行自学。 到目前为止,我设法确定请求会生成带有 m3u8 信息的 json 响应。 例如,https://headlines.yahoo.co.jp
谷歌地图 API 需要这样的参数: NSString *urlString=@"http://maps.google.com/maps?saddr=43.2923,5.45427&daddr=43.4
“parameterValue”是在 Javascript 中的事件上传递的默认参数吗?谁能解释一下这个值从何而来。 Load Ajax content 我发现它在以下文章中使用 - http://w
我有一个 .SWF 电子邮件提交表单。背景颜色通过以下方式设置: `` 并嵌入: `` 是否可以将鼠标悬停在对象或包含的 div 上来更改这些值?即#ffffff 非常感谢! 最佳答案 将 wmode
假设我想用指数函数拟合两个数组x_data_one和y_data_one。为此,我可以使用以下代码(其中 x_data_one 和 y_data_one 被赋予虚拟定义): import numpy
有什么方法可以填充 parameters在基于外部属性文件内容的 Liquibase 变更日志文件中? 例如,我希望能够说: 并将 table.name 的值和
我必须按原样发送参数值 'AbCd/EfgH'。但是 Angular 将 '/' 转义为 %2F。我无法控制 URL。 解决这个问题的最佳方法是什么? 我不想强制 Angular 停止对所有其他 UR
我是一名优秀的程序员,十分优秀!