日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

surefire 拉起testng单元测试类的源码流程阅读(一)

發布時間:2023/12/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 surefire 拉起testng单元测试类的源码流程阅读(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里分析是基于2.5surefire 版本。

首先拿surefire 拉起單元測試報錯日志 分析:

Caused by: java.io.IOException: Error while instrumenting class com/suning/gcps/newutils/string/StringUtils.at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrumentError(Instrumenter.java:160)at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrumenter.java:111)at org.jacoco.agent.rt.internal_6da5971.CoverageTransformer.transform(CoverageTransformer.java:91)... 46 more Caused by: java.lang.IllegalStateException: Class com/suning/gcps/newutils/string/StringUtils is already instrumented.at org.jacoco.agent.rt.internal_6da5971.core.internal.instr.InstrSupport.assertNotInstrumented(InstrSupport.java:89)at org.jacoco.agent.rt.internal_6da5971.core.internal.instr.ClassInstrumenter.visitField(ClassInstrumenter.java:55)at org.jacoco.agent.rt.internal_6da5971.asm.ClassVisitor.visitField(ClassVisitor.java:272)at org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.readField(ClassReader.java:768)at org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.accept(ClassReader.java:689)at org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.accept(ClassReader.java:506)at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrumenter.java:84)at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrumenter.java:108)... 47 more 11:38:21.536 [main] ERROR c.s.gcps.newutils.string.StringUtils - 數據格式轉換錯誤!3w java.lang.NumberFormatException: For input string: "3w"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.7.0_75]at java.lang.Integer.parseInt(Integer.java:492) ~[na:1.7.0_75]at java.lang.Integer.parseInt(Integer.java:527) ~[na:1.7.0_75]at com.suning.gcps.newutils.string.StringUtils.isIntString(StringUtils.java:216) ~[classes/:na]at com.suning.gcps.newutils.string.StringUtilsTest.test(StringUtilsTest.java:33) [test-classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_75]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_75]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_75]at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_75]at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:100) [testng-6.9.12.jar:na]at org.testng.internal.Invoker.invokeMethod(Invoker.java:646) [testng-6.9.12.jar:na]at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811) [testng-6.9.12.jar:na]at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1129) [testng-6.9.12.jar:na]at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) [testng-6.9.12.jar:na]at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) [testng-6.9.12.jar:na]at org.testng.TestRunner.privateRun(TestRunner.java:746) [testng-6.9.12.jar:na]at org.testng.TestRunner.run(TestRunner.java:600) [testng-6.9.12.jar:na]at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) [testng-6.9.12.jar:na]at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) [testng-6.9.12.jar:na]at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) [testng-6.9.12.jar:na]at org.testng.SuiteRunner.run(SuiteRunner.java:268) [testng-6.9.12.jar:na]at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) [testng-6.9.12.jar:na]at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) [testng-6.9.12.jar:na]at org.testng.TestNG.runSuitesSequentially(TestNG.java:1264) [testng-6.9.12.jar:na]at org.testng.TestNG.runSuitesLocally(TestNG.java:1189) [testng-6.9.12.jar:na]at org.testng.TestNG.runSuites(TestNG.java:1104) [testng-6.9.12.jar:na]at org.testng.TestNG.run(TestNG.java:1076) [testng-6.9.12.jar:na]at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:62) [surefire-testng-2.5.jar:2.5]at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:141) [surefire-testng-2.5.jar:2.5]at org.apache.maven.surefire.Surefire.run(Surefire.java:180) [surefire-api-2.5.jar:2.5]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_75]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_75]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_75]at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_75]at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) [surefire-booter-2.5.jar:2.5]at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021) [surefire-booter-2.5.jar:2.5]

上述報錯日志展示 testng使用6.9.12 ,surefire使用的2.5版本。

->?SuiteRunnerWorker.run -> runSuites

-> SuiteRunner.run -> privateRun ->?invokeTestMethods?

->testng.internal.TestMethodWorker.run ->?invokeTestMethods

->testng.internal.Invoker.invokeTestMethods ->?invokeMethod

->testng.internal.MethodInvocationHelper.invokeMethod

然后surefire 通過調用?SurefireBooter.main(surefire-booter.jar) ->?SurefireBooter.runSuitesInProcess

->?maven.surefire.Surefire.run(surefire-api-2.5.jar)

->?testng.TestNGExecutor.run(surefire-testng-2.5)

->?TestNG.run(testng-6.9.12)

SurefireBooter 代碼:

static{try{assertionStatusMethod = class$java$lang$ClassLoader.getMethod("setDefaultAssertionStatus", new Class[] { Boolean.TYPE });}catch (NoSuchMethodException e){assertionStatusMethod = null;}}public SurefireBooter(){this.isForked = false;}private SurefireBooter(boolean isForked){this.isForked = isForked;}public void addReport(String report){addReport(report, null);}public void addReport(String report, Object[] constructorParams){this.reports.add(new Object[] { report, constructorParams });}public void addTestSuite(String suiteClassName, Object[] constructorParams){this.testSuites.add(new Object[] { suiteClassName, constructorParams });}public void addClassPathUrl(String path){if (!this.classPathUrls.contains(path)) {this.classPathUrls.add(path);}}public void addSurefireClassPathUrl(String path){if (!this.surefireClassPathUrls.contains(path)) {this.surefireClassPathUrls.add(path);}}public void addSurefireBootClassPathUrl(String path){if (!this.surefireBootClassPathUrls.contains(path)) {this.surefireBootClassPathUrls.add(path);}}public void setFailIfNoTests(boolean failIfNoTests){this.failIfNoTests = failIfNoTests;}public void setRedirectTestOutputToFile(boolean redirectTestOutputToFile){this.redirectTestOutputToFile = redirectTestOutputToFile;}public void setReportsDirectory(File reportsDirectory){this.reportsDirectory = reportsDirectory;}public File getReportsDirectory(){return this.reportsDirectory;}public void setForkConfiguration(ForkConfiguration forkConfiguration){this.forkConfiguration = forkConfiguration;}public boolean isForking(){return this.forkConfiguration.isForking();}public int run()throws SurefireBooterForkException, SurefireExecutionException{int result;if ("never".equals(this.forkConfiguration.getForkMode())){result = runSuitesInProcess();}else{int result;if ("once".equals(this.forkConfiguration.getForkMode())){result = runSuitesForkOnce();}else{int result;if ("always".equals(this.forkConfiguration.getForkMode())) {result = runSuitesForkPerTestSet();} else {throw new SurefireExecutionException("Unknown forkmode: " + this.forkConfiguration.getForkMode(), null);}}}int result;return result;}private int runSuitesInProcess(String testSet, Properties results)throws SurefireExecutionException{if (this.testSuites.size() != 1) {throw new IllegalArgumentException("Cannot only specify testSet for single test suites");}ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();try{ClassLoader testsClassLoader = useSystemClassLoader() ? ClassLoader.getSystemClassLoader() : createClassLoader(this.classPathUrls, null, this.childDelegation);ClassLoader surefireClassLoader = createClassLoader(this.surefireClassPathUrls, testsClassLoader);Class surefireClass = surefireClassLoader.loadClass(Surefire.class.getName());Object surefire = surefireClass.newInstance();Method run = surefireClass.getMethod("run", new Class[] { List.class, new Object[0].getClass(), String.class, ClassLoader.class, ClassLoader.class, Properties.class, Boolean.class });Thread.currentThread().setContextClassLoader(testsClassLoader);Integer result = (Integer)run.invoke(surefire, new Object[] { this.reports, this.testSuites.get(0), testSet, surefireClassLoader, testsClassLoader, results, new Boolean(this.failIfNoTests) });return result.intValue();}catch (InvocationTargetException e){throw new SurefireExecutionException(e.getTargetException().getMessage(), e.getTargetException());}catch (Exception e){throw new SurefireExecutionException("Unable to instantiate and execute Surefire", e);}finally{Thread.currentThread().setContextClassLoader(oldContextClassLoader);}}private int runSuitesInProcess()throws SurefireExecutionException{ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();try{String testClassPath = getTestClassPathAsString();System.setProperty("surefire.test.class.path", testClassPath);ClassLoader testsClassLoader;if (useManifestOnlyJar()){ClassLoader testsClassLoader = getClass().getClassLoader();System.setProperty("surefire.real.class.path", System.getProperty("java.class.path"));System.setProperty("java.class.path", testClassPath);}else{testsClassLoader = createClassLoader(this.classPathUrls, null, this.childDelegation);}ClassLoader surefireClassLoader = createClassLoader(this.surefireClassPathUrls, testsClassLoader);Class surefireClass = surefireClassLoader.loadClass(Surefire.class.getName());Object surefire = surefireClass.newInstance();Method run = surefireClass.getMethod("run", new Class[] { List.class, List.class, ClassLoader.class, ClassLoader.class, Boolean.class });Thread.currentThread().setContextClassLoader(testsClassLoader);Integer result = (Integer)run.invoke(surefire, new Object[] { this.reports, this.testSuites, surefireClassLoader, testsClassLoader, new Boolean(this.failIfNoTests) });return result.intValue();}catch (InvocationTargetException e){throw new SurefireExecutionException(e.getTargetException().getMessage(), e.getTargetException());}catch (Exception e){throw new SurefireExecutionException("Unable to instantiate and execute Surefire", e);}finally{Thread.currentThread().setContextClassLoader(oldContextClassLoader);}}private String getTestClassPathAsString(){StringBuffer sb = new StringBuffer();for (int i = 0; i < this.classPathUrls.size(); i++) {sb.append(this.classPathUrls.get(i)).append(File.pathSeparatorChar);}return sb.toString();}private int runSuitesForkOnce()throws SurefireBooterForkException{return forkSuites(this.testSuites, true, true);}private int runSuitesForkPerTestSet()throws SurefireBooterForkException{ClassLoader testsClassLoader;ClassLoader surefireClassLoader;try{testsClassLoader = createClassLoader(this.classPathUrls, null, false);surefireClassLoader = createClassLoader(this.surefireClassPathUrls, testsClassLoader, false);}catch (MalformedURLException e){throw new SurefireBooterForkException("Unable to create classloader to find test suites", e);}int globalResult = 0;boolean showHeading = true;Properties properties = new Properties();for (Iterator i = this.testSuites.iterator(); i.hasNext();){testSuite = (Object[])i.next();Map testSets = getTestSets(testSuite, testsClassLoader, surefireClassLoader);for (j = testSets.keySet().iterator(); j.hasNext();){Object testSet = j.next();boolean showFooter = (!j.hasNext()) && (!i.hasNext());int result = forkSuite(testSuite, testSet, showHeading, showFooter, properties);if (result > globalResult) {globalResult = result;}showHeading = false;}}Object[] testSuite;Iterator j;return globalResult;}private Map getTestSets(Object[] testSuite, ClassLoader testsClassLoader, ClassLoader surefireClassLoader)throws SurefireBooterForkException{String className = (String)testSuite[0];Object[] params = (Object[])testSuite[1];Object suite;try{suite = Surefire.instantiateObject(className, params, surefireClassLoader);}catch (TestSetFailedException e){throw new SurefireBooterForkException(e.getMessage(), e.getCause());}catch (ClassNotFoundException e){throw new SurefireBooterForkException("Unable to find class for test suite '" + className + "'", e);}catch (NoSuchMethodException e){throw new SurefireBooterForkException("Unable to find appropriate constructor for test suite '" + className + "': " + e.getMessage(), e);}Map testSets;try{Method m = suite.getClass().getMethod("locateTestSets", new Class[] { ClassLoader.class });testSets = (Map)m.invoke(suite, new Object[] { testsClassLoader });}catch (IllegalAccessException e){throw new SurefireBooterForkException("Error obtaining test sets", e);}catch (NoSuchMethodException e){throw new SurefireBooterForkException("Error obtaining test sets", e);}catch (InvocationTargetException e){throw new SurefireBooterForkException(e.getTargetException().getMessage(), e.getTargetException());}return testSets;}private int forkSuites(List testSuites, boolean showHeading, boolean showFooter)throws SurefireBooterForkException{Properties properties = new Properties();setForkProperties(testSuites, properties);return fork(properties, showHeading, showFooter);}private int forkSuite(Object[] testSuite, Object testSet, boolean showHeading, boolean showFooter, Properties properties)throws SurefireBooterForkException{setForkProperties(Collections.singletonList(testSuite), properties);if ((testSet instanceof String)) {properties.setProperty("testSet", (String)testSet);}return fork(properties, showHeading, showFooter);}private void setForkProperties(List testSuites, Properties properties){addPropertiesForTypeHolder(this.reports, properties, "report.");addPropertiesForTypeHolder(testSuites, properties, "testSuite.");for (int i = 0; i < this.classPathUrls.size(); i++){String url = (String)this.classPathUrls.get(i);properties.setProperty("classPathUrl." + i, url);}for (int i = 0; i < this.surefireClassPathUrls.size(); i++){String url = (String)this.surefireClassPathUrls.get(i);properties.setProperty("surefireClassPathUrl." + i, url);}properties.setProperty("childDelegation", String.valueOf(this.childDelegation));properties.setProperty("enableAssertions", String.valueOf(this.enableAssertions));properties.setProperty("useSystemClassLoader", String.valueOf(useSystemClassLoader()));properties.setProperty("useManifestOnlyJar", String.valueOf(useManifestOnlyJar()));properties.setProperty("failIfNoTests", String.valueOf(this.failIfNoTests));}private File writePropertiesFile(String name, Properties properties)throws IOException{File file = File.createTempFile(name, "tmp");if (!this.forkConfiguration.isDebug()) {file.deleteOnExit();}writePropertiesFile(file, name, properties);return file;}private void writePropertiesFile(File file, String name, Properties properties)throws IOException{FileOutputStream out = new FileOutputStream(file);try{properties.store(out, name);}finally{IOUtil.close(out);}}private void addPropertiesForTypeHolder(List typeHolderList, Properties properties, String propertyPrefix){for (int i = 0; i < typeHolderList.size(); i++){Object[] report = (Object[])typeHolderList.get(i);String className = (String)report[0];Object[] params = (Object[])report[1];properties.setProperty(propertyPrefix + i, className);if (params != null){String paramProperty = convert(params[0]);String typeProperty = params[0].getClass().getName();for (int j = 1; j < params.length; j++){paramProperty = paramProperty + "|";typeProperty = typeProperty + "|";if (params[j] != null){paramProperty = paramProperty + convert(params[j]);typeProperty = typeProperty + params[j].getClass().getName();}}properties.setProperty(propertyPrefix + i + ".params", paramProperty);properties.setProperty(propertyPrefix + i + ".types", typeProperty);}}}private static String convert(Object param){if ((param instanceof File[])){File[] files = (File[])param;return "[" + StringUtils.join(files, ",") + "]";}if ((param instanceof Properties)){ByteArrayOutputStream baos = new ByteArrayOutputStream();try{((Properties)param).store(baos, "");return new String(baos.toByteArray(), "8859_1");}catch (Exception e){throw new RuntimeException("bug in property conversion", e);}}return param.toString();}private boolean useSystemClassLoader(){return (this.forkConfiguration.isUseSystemClassLoader()) && ((this.isForked) || (this.forkConfiguration.isForking()));}private boolean useManifestOnlyJar(){return (this.forkConfiguration.isUseSystemClassLoader()) && (this.forkConfiguration.isUseManifestOnlyJar());}private int fork(Properties properties, boolean showHeading, boolean showFooter)throws SurefireBooterForkException{File systemProperties = null;File surefireProperties;try{surefireProperties = writePropertiesFile("surefire", properties);if (this.forkConfiguration.getSystemProperties() != null) {systemProperties = writePropertiesFile("surefire", this.forkConfiguration.getSystemProperties());}}catch (IOException e){throw new SurefireBooterForkException("Error creating properties files for forking", e);}List bootClasspath = new ArrayList(this.surefireBootClassPathUrls.size() + this.classPathUrls.size());bootClasspath.addAll(this.surefireBootClassPathUrls);if (useSystemClassLoader()) {bootClasspath.addAll(this.classPathUrls);}Commandline cli = this.forkConfiguration.createCommandLine(bootClasspath, useManifestOnlyJar());cli.createArg().setFile(surefireProperties);if (systemProperties != null) {cli.createArg().setFile(systemProperties);}ForkingStreamConsumer out = getForkingStreamConsumer(showHeading, showFooter, this.redirectTestOutputToFile);StreamConsumer err;StreamConsumer err;if (this.redirectTestOutputToFile) {err = out;} else {err = getForkingStreamConsumer(showHeading, showFooter, this.redirectTestOutputToFile);}if (this.forkConfiguration.isDebug()) {System.out.println("Forking command line: " + cli);}int returnCode;try{returnCode = CommandLineUtils.executeCommandLine(cli, out, err, this.forkedProcessTimeoutInSeconds);}catch (CommandLineException e){throw new SurefireBooterForkException("Error while executing forked tests.", e);}if (this.redirectTestOutputToFile) {try{out.getOutputConsumer().testSetCompleted();}catch (Exception e) {}}if ((surefireProperties != null) && (surefireProperties.exists())){FileInputStream inStream = null;try{inStream = new FileInputStream(surefireProperties);properties.load(inStream);}catch (FileNotFoundException e){throw new SurefireBooterForkException("Unable to reload properties file from forked process", e);}catch (IOException e){throw new SurefireBooterForkException("Unable to reload properties file from forked process", e);}finally{IOUtil.close(inStream);}}return returnCode;}private ClassLoader createClassLoader(List classPathUrls, ClassLoader parent)throws MalformedURLException{return createClassLoader(classPathUrls, parent, false);}private ClassLoader createClassLoader(List classPathUrls, ClassLoader parent, boolean childDelegation)throws MalformedURLException{List urls = new ArrayList();for (Iterator i = classPathUrls.iterator(); i.hasNext();){String url = (String)i.next();if (url != null){File f = new File(url);urls.add(UrlUtils.getURL(f));}}IsolatedClassLoader classLoader = new IsolatedClassLoader(parent, childDelegation);if (assertionStatusMethod != null) {try{Object[] args = { this.enableAssertions ? Boolean.TRUE : Boolean.FALSE };if (parent != null) {assertionStatusMethod.invoke(parent, args);}assertionStatusMethod.invoke(classLoader, args);}catch (IllegalAccessException e){throw new NestedRuntimeException("Unable to access the assertion enablement method", e);}catch (InvocationTargetException e){throw new NestedRuntimeException("Unable to invoke the assertion enablement method", e);}}for (Iterator iter = urls.iterator(); iter.hasNext();){URL url = (URL)iter.next();classLoader.addURL(url);}return classLoader;}private static List processStringList(String stringList){String sl = stringList;if ((sl.startsWith("[")) && (sl.endsWith("]"))) {sl = sl.substring(1, sl.length() - 1);}List list = new ArrayList();String[] stringArray = StringUtils.split(sl, ",");for (int i = 0; i < stringArray.length; i++) {list.add(stringArray[i].trim());}return list;}private static Properties loadProperties(File file)throws IOException{Properties p = new Properties();if ((file != null) && (file.exists())){FileInputStream inStream = new FileInputStream(file);try{p.load(inStream);}finally{IOUtil.close(inStream);}}return p;}private static void setSystemProperties(File file)throws IOException{Properties p = loadProperties(file);for (Iterator i = p.keySet().iterator(); i.hasNext();){String key = (String)i.next();System.setProperty(key, p.getProperty(key));}}private static Object[] constructParamObjects(String paramProperty, String typeProperty){Object[] paramObjects = null;if (paramProperty != null){String[] params = StringUtils.split(StringUtils.replace(StringUtils.replace(paramProperty, "||", "| |"), "||", "| |"), "|");String[] types = StringUtils.split(StringUtils.replace(StringUtils.replace(typeProperty, "||", "| |"), "||", "| |"), "|");paramObjects = new Object[params.length];for (int i = 0; i < types.length; i++) {if (types[i].trim().length() == 0){params[i] = null;}else if (types[i].equals(String.class.getName())){paramObjects[i] = params[i];}else if (types[i].equals(File.class.getName())){paramObjects[i] = new File(params[i]);}else if (types[i].equals(new File[0].getClass().getName())){List stringList = processStringList(params[i]);File[] fileList = new File[stringList.size()];for (int j = 0; j < stringList.size(); j++) {fileList[j] = new File((String)stringList.get(j));}paramObjects[i] = fileList;}else if (types[i].equals(ArrayList.class.getName())){paramObjects[i] = processStringList(params[i]);}else if (types[i].equals(Boolean.class.getName())){paramObjects[i] = Boolean.valueOf(params[i]);}else if (types[i].equals(Integer.class.getName())){paramObjects[i] = Integer.valueOf(params[i]);}else if (types[i].equals(Properties.class.getName())){Properties result = new Properties();String value = params[i];try{ByteArrayInputStream bais = new ByteArrayInputStream(value.getBytes("8859_1"));result.load(bais);}catch (Exception e){throw new RuntimeException("bug in property conversion", e);}paramObjects[i] = result;}else{throw new IllegalArgumentException("Unknown parameter type: " + types[i]);}}}return paramObjects;}public static void main(String[] args)throws Throwable{try{if (args.length > 1) {setSystemProperties(new File(args[1]));}File surefirePropertiesFile = new File(args[0]);Properties p = loadProperties(surefirePropertiesFile);SortedMap classPathUrls = new TreeMap();SortedMap surefireClassPathUrls = new TreeMap();SurefireBooter surefireBooter = new SurefireBooter(true);ForkConfiguration forkConfiguration = new ForkConfiguration();forkConfiguration.setForkMode("never");surefireBooter.setForkConfiguration(forkConfiguration);for (Enumeration e = p.propertyNames(); e.hasMoreElements();){String name = (String)e.nextElement();if ((name.startsWith("report.")) && (!name.endsWith(".params")) && (!name.endsWith(".types"))){String className = p.getProperty(name);String params = p.getProperty(name + ".params");String types = p.getProperty(name + ".types");surefireBooter.addReport(className, constructParamObjects(params, types));}else if ((name.startsWith("testSuite.")) && (!name.endsWith(".params")) && (!name.endsWith(".types"))){String className = p.getProperty(name);String params = p.getProperty(name + ".params");String types = p.getProperty(name + ".types");surefireBooter.addTestSuite(className, constructParamObjects(params, types));}else if (name.startsWith("classPathUrl.")){classPathUrls.put(Integer.valueOf(name.substring(name.indexOf('.') + 1)), p.getProperty(name));}else if (name.startsWith("surefireClassPathUrl.")){surefireClassPathUrls.put(Integer.valueOf(name.substring(name.indexOf('.') + 1)), p.getProperty(name));}else if (name.startsWith("surefireBootClassPathUrl.")){surefireBooter.addSurefireBootClassPathUrl(p.getProperty(name));}else if ("childDelegation".equals(name)){surefireBooter.childDelegation = Boolean.valueOf(p.getProperty("childDelegation")).booleanValue();}else if ("enableAssertions".equals(name)){surefireBooter.enableAssertions = Boolean.valueOf(p.getProperty("enableAssertions")).booleanValue();}else if ("useSystemClassLoader".equals(name)){boolean value = Boolean.valueOf(p.getProperty("useSystemClassLoader")).booleanValue();surefireBooter.forkConfiguration.setUseSystemClassLoader(value);}else if ("useManifestOnlyJar".equals(name)){boolean value = Boolean.valueOf(p.getProperty("useManifestOnlyJar")).booleanValue();surefireBooter.forkConfiguration.setUseManifestOnlyJar(value);}else if ("failIfNoTests".equals(name)){boolean value = Boolean.valueOf(p.getProperty("failIfNoTests")).booleanValue();surefireBooter.setFailIfNoTests(value);}}for (Iterator cpi = classPathUrls.keySet().iterator(); cpi.hasNext();){String url = (String)classPathUrls.get(cpi.next());surefireBooter.addClassPathUrl(url);}for (Iterator scpi = surefireClassPathUrls.keySet().iterator(); scpi.hasNext();){String url = (String)surefireClassPathUrls.get(scpi.next());surefireBooter.addSurefireClassPathUrl(url);}String testSet = p.getProperty("testSet");int result;int result;if (testSet != null) {result = surefireBooter.runSuitesInProcess(testSet, p);} else {result = surefireBooter.runSuitesInProcess();}surefireBooter.writePropertiesFile(surefirePropertiesFile, "surefire", p);System.exit(result);}catch (Throwable t){t.printStackTrace(System.err);System.exit(1);}}public void setChildDelegation(boolean childDelegation){this.childDelegation = childDelegation;}private ForkingStreamConsumer getForkingStreamConsumer(boolean showHeading, boolean showFooter, boolean redirectTestOutputToFile){OutputConsumer outputConsumer = new StandardOutputConsumer();if (redirectTestOutputToFile) {outputConsumer = new FileOutputConsumerProxy(outputConsumer, getReportsDirectory());}if (!showHeading) {outputConsumer = new SupressHeaderOutputConsumerProxy(outputConsumer);}if (!showFooter) {outputConsumer = new SupressFooterOutputConsumerProxy(outputConsumer);}return new ForkingStreamConsumer(outputConsumer);}public void setEnableAssertions(boolean enableAssertions){this.enableAssertions = enableAssertions;}public void setForkedProcessTimeoutInSeconds(int forkedProcessTimeoutInSeconds){this.forkedProcessTimeoutInSeconds = forkedProcessTimeoutInSeconds;} TestNGExecutor類代碼:
public class TestNGExecutor {public static void run(Class[] testClasses, String testSourceDirectory, Map options, ArtifactVersion version, String classifier, ReporterManager reportManager, SurefireTestSuite suite, File reportsDirectory)throws TestSetFailedException{TestNG testng = new TestNG(true);Configurator configurator = getConfigurator(version);configurator.configure(testng, options);postConfigure(testng, testSourceDirectory, classifier, reportManager, suite, reportsDirectory);testng.setTestClasses(testClasses);testng.run();}public static void run(List suiteFiles, String testSourceDirectory, Map options, ArtifactVersion version, String classifier, ReporterManager reportManager, SurefireTestSuite suite, File reportsDirectory)throws TestSetFailedException{TestNG testng = new TestNG(true);Configurator configurator = getConfigurator(version);configurator.configure(testng, options);postConfigure(testng, testSourceDirectory, classifier, reportManager, suite, reportsDirectory);testng.setTestSuites(suiteFiles);testng.run();}private static Configurator getConfigurator(ArtifactVersion version)throws TestSetFailedException{try{VersionRange range = VersionRange.createFromVersionSpec("[4.7,5.1]");if (range.containsVersion(version)) {return new TestNG4751Configurator();}range = VersionRange.createFromVersionSpec("[5.2]");if (range.containsVersion(version)) {return new TestNG52Configurator();}range = VersionRange.createFromVersionSpec("[5.3,)");if (range.containsVersion(version)) {return new TestNGMapConfigurator();}throw new TestSetFailedException("Unknown TestNG version " + version);}catch (InvalidVersionSpecificationException invsex){throw new TestSetFailedException("Bug in plugin. Please report it with the attached stacktrace", invsex);}}private static void postConfigure(TestNG testNG, String sourcePath, String classifier, ReporterManager reportManager, SurefireTestSuite suite, File reportsDirectory)throws TestSetFailedException{testNG.setVerbose(0);TestNGReporter reporter = createTestNGReporter(reportManager, suite);testNG.addListener(reporter);if (sourcePath != null) {testNG.setSourcePath(sourcePath);}testNG.setOutputDirectory(reportsDirectory.getAbsolutePath());}private static TestNGReporter createTestNGReporter(ReporterManager reportManager, SurefireTestSuite suite){try{Class.forName("org.testng.internal.IResultListener");Class c = Class.forName("org.apache.maven.surefire.testng.ConfigurationAwareTestNGReporter");try{Constructor ctor = c.getConstructor(new Class[] { ReporterManager.class, SurefireTestSuite.class });return (TestNGReporter)ctor.newInstance(new Object[] { reportManager, suite });}catch (Exception e){throw new RuntimeException("Bug in ConfigurationAwareTestNGReporter", e);}return new TestNGReporter(reportManager);}catch (ClassNotFoundException e) {}}private static void attachNonStandardReporter(TestNG testNG, String className){try{Class c = Class.forName(className);if (IReporter.class.isAssignableFrom(c)) {testNG.addListener(c.newInstance());}}catch (Exception e) {}} } TestNG類關鍵代碼:
public void run() {initializeSuitesAndJarFile();initializeConfiguration();initializeDefaultListeners();initializeCommandLineSuites();initializeCommandLineSuitesParams();initializeCommandLineSuitesGroups();sanityCheck();List<ISuite> suiteRunners = null;runExecutionListeners(true /* start */);m_start = System.currentTimeMillis();//// Slave mode//if (m_slavefileName != null) {SuiteSlave slave = new SuiteSlave( m_slavefileName, this );slave.waitForSuites();}//// Regular mode//else if (m_masterfileName == null) {suiteRunners = runSuitesLocally();}//// Master mode//else {SuiteDispatcher dispatcher = new SuiteDispatcher(m_masterfileName);suiteRunners = dispatcher.dispatch(getConfiguration(),m_suites, getOutputDirectory(),getTestListeners());}m_end = System.currentTimeMillis();runExecutionListeners(false /* finish */);if(null != suiteRunners) {generateReports(suiteRunners);}if(!m_hasTests) {setStatus(HAS_NO_TEST);if (TestRunner.getVerbose() > 1) {System.err.println("[TestNG] No tests found. Nothing was run");usage();}}}
public List<ISuite> runSuitesLocally() {SuiteRunnerMap suiteRunnerMap = new SuiteRunnerMap();if (m_suites.size() > 0) {if (m_suites.get(0).getVerbose() >= 2) {Version.displayBanner();}// First initialize the suite runners to ensure there are no configuration issues.// Create a map with XmlSuite as key and corresponding SuiteRunner as valuefor (XmlSuite xmlSuite : m_suites) {createSuiteRunners(suiteRunnerMap, xmlSuite);}//// Run suites//if (m_suiteThreadPoolSize == 1 && !m_randomizeSuites) {// Single threaded and not randomized: run the suites in orderfor (XmlSuite xmlSuite : m_suites) {runSuitesSequentially(xmlSuite, suiteRunnerMap, getVerbose(xmlSuite),getDefaultSuiteName());}} else {// Multithreaded: generate a dynamic graph that stores the suite hierarchy. This is then// used to run related suites in specific order. Parent suites are run only// once all the child suites have completed executionDynamicGraph<ISuite> suiteGraph = new DynamicGraph<ISuite>();for (XmlSuite xmlSuite : m_suites) {populateSuiteGraph(suiteGraph, suiteRunnerMap, xmlSuite);}IThreadWorkerFactory<ISuite> factory = new SuiteWorkerFactory(suiteRunnerMap,0 /* verbose hasn't been set yet */, getDefaultSuiteName());GraphThreadPoolExecutor<ISuite> pooledExecutor =new GraphThreadPoolExecutor<ISuite>(suiteGraph, factory, m_suiteThreadPoolSize,m_suiteThreadPoolSize, Integer.MAX_VALUE, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());Utils.log("TestNG", 2, "Starting executor for all suites");// Run all suites in parallelpooledExecutor.run();try {pooledExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);pooledExecutor.shutdownNow();}catch (InterruptedException handled) {Thread.currentThread().interrupt();error("Error waiting for concurrent executors to finish " + handled.getMessage());}}}else {setStatus(HAS_NO_TEST);error("No test suite found. Nothing to run");usage();}




總結

以上是生活随笔為你收集整理的surefire 拉起testng单元测试类的源码流程阅读(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

人人视频网站 | www亚洲视频 | www91在线| 亚洲蜜桃在线 | 狠狠干夜夜爱 | 日韩成片 | 亚洲国产中文字幕在线观看 | 国产精品video爽爽爽爽 | 天天爽综合网 | 香蕉免费 | 欧美大片在线观看一区 | 91香蕉视频在线下载 | 天天干天天搞天天射 | 国产精品毛片一区视频 | 国产不卡av在线播放 | 99精品久久久 | www.夜夜操.com | 精品国产激情 | 亚洲第一区在线播放 | 久久女教师| 日韩三级成人 | 最新精品视频在线 | 青青久草在线视频 | 久久a久久 | 亚洲电影自拍 | 欧美日韩另类在线观看 | 免费在线观看亚洲视频 | 久久精彩视频 | 99精品国产在热久久 | 永久黄网站色视频免费观看w | 天天操天天干天天玩 | av免费观看在线 | 在线观看免费视频 | 欧美性超爽 | 最近高清中文字幕在线国语5 | 国产五月婷婷 | 亚洲乱码国产乱码精品天美传媒 | 99产精品成人啪免费网站 | 人人干在线 | 国产欧美综合在线观看 | 色视频网站在线 | 国产原厂视频在线观看 | 欧美日韩一区二区久久 | 精品中文字幕在线 | 日韩a在线播放 | 日韩免费电影一区二区 | 欧美日韩国产网站 | 国产成人中文字幕 | 久久草精品 | 国产精品久久精品国产 | 久香蕉| 九九99视频 | 久久综合成人网 | 欧美成人手机版 | 久久久久亚洲最大xxxx | 超碰公开97 | 国产91在线观 | 91精品国产高清自在线观看 | 国产一区二区观看 | www色网站| 四虎成人免费影院 | 91视频网址入口 | 97国产视频 | 五月天激情婷婷 | 久久久久久久久福利 | 国产在线视频在线观看 | www91在线观看| 人人玩人人添人人澡超碰 | 日韩免费视频观看 | 久久久综合精品 | 欧美在线日韩在线 | 2022久久国产露脸精品国产 | 在线成人免费电影 | 久久超级碰 | 777久久久| 精品国产一区二区在线 | 特级大胆西西4444www | 国产99久久久久久免费看 | 日本性xxx| 国产精品一区在线 | 久久久久久久久免费 | av电影在线免费 | 亚洲成人欧美 | 91香蕉视频污在线 | 国产精品网红直播 | 亚洲精品动漫久久久久 | 在线观看免费版高清版 | 九九视频热 | 超碰97av在线 | 亚洲精品视频在线看 | 麻豆视传媒官网免费观看 | 999国产在线| 亚洲闷骚少妇在线观看网站 | 不卡的av | 久久国产品 | 国产高清免费在线观看 | 亚洲一区精品人人爽人人躁 | 1024久久| 国产精品久久久久久久久久 | 久久99精品国产99久久 | 少妇高潮流白浆在线观看 | 4438全国亚洲精品观看视频 | 天天色官网 | 一区二区三区在线视频观看58 | 亚洲精品高清视频在线观看 | 久久精品牌麻豆国产大山 | 网站免费黄色 | 最新色视频 | 久草精品视频在线看网站免费 | 一区二区不卡高清 | 国产a国产a国产a | 九九久久久久久久久激情 | 在线观看中文字幕一区二区 | 亚洲天天在线日亚洲洲精 | 日韩精品中字 | 国产精品 中文字幕 亚洲 欧美 | 亚洲免费在线视频 | 国产精品福利午夜在线观看 | 99久久久久国产精品免费 | 亚洲免费精彩视频 | 色狠狠婷婷 | 精品国产1区2区3区 国产欧美精品在线观看 | 黄色精品一区二区 | 成人动漫视频在线 | 久久小视频 | 五月激情五月激情 | 小草av在线播放 | 久久九精品 | 99久热在线精品视频成人一区 | 久久中文字幕导航 | 国产成人精品亚洲a | 人人艹视频 | 伊在线视频 | 色噜噜在线观看 | 亚洲欧洲日韩在线观看 | 丁香婷婷激情五月 | 免费观看黄 | 国产精品12 | 五月婷婷在线视频观看 | 欧美做受高潮电影o | 久久国产免费看 | 午夜av在线播放 | 亚洲伊人天堂 | 天天射日 | 久久精品官网 | 国产中文a| 最新婷婷色| 国产一区二区三区免费在线观看 | 日韩视频在线观看免费 | 欧美性极品xxxx做受 | 一级黄色大片在线观看 | 国产午夜免费视频 | av片中文| 中文字幕二区三区 | 最新国产中文字幕 | 欧美精品免费在线观看 | 久草观看视频 | 久久草 | 91精品天码美女少妇 | 五月天丁香 | 久久久久久蜜av免费网站 | 午夜精品久久久久久99热明星 | av电影在线观看完整版一区二区 | 热久久免费视频精品 | 一区二区三区免费 | 日韩精品免费在线观看视频 | av综合 日韩| 亚洲三级在线免费观看 | 欧美成人在线免费观看 | 99亚洲国产 | 日韩大片在线观看 | 人人澡人摸人人添学生av | 久草视频在线播放 | 欧美日韩国产伦理 | 视频一区二区精品 | 亚洲国产mv| 中文字幕影视 | 久久久91精品国产一区二区精品 | 日韩精品一区二区在线视频 | 视频国产| 激情久久小说 | 一区二区三区在线电影 | 国产精品99蜜臀久久不卡二区 | 日韩精品三区四区 | 日本精品久久久久中文字幕 | 最近免费中文字幕大全高清10 | 免费人人干 | 天天亚洲 | 国产一级高清 | 久久免费视频3 | 欧美精品一区二区免费 | 婷婷伊人五月 | 在线播放日韩av | 超碰人人在线观看 | 成人在线观看影院 | 国产伦精品一区二区三区无广告 | 欧美另类高清 | 亚洲最新视频在线播放 | 99精品视频网| 最新中文字幕在线播放 | 久久久九色精品国产一区二区三区 | 97精品国产 | 欧美做受69 | 亚洲女同videos | 日韩欧美国产成人 | 欧美日韩免费在线观看视频 | 91亚洲视频在线观看 | 成人久久综合 | 亚洲一区二区三区在线看 | 天天爱av导航 | 江苏妇搡bbbb搡bbbb | 99视频国产精品 | 久久综合影音 | 天天爱天天操天天干 | 五月色婷 | 江苏妇搡bbbb搡bbbb | 黄色国产高清 | 久草视频在线免费播放 | 久久久免费毛片 | 国产99久久精品一区二区永久免费 | 国产1级毛片 | 中文字幕在线观看第一页 | 国产在线欧美日韩 | 久久精品欧美一 | 久一在线 | 在线免费观看欧美日韩 | 96亚洲精品久久久蜜桃 | 免费一级片在线观看 | 婷婷在线精品视频 | 日日操日日操 | 国产精品一区二区三区免费看 | 中文字幕亚洲情99在线 | 91av视频免费在线观看 | 精品国产免费一区二区三区五区 | 久久精品国产亚洲a | 婷婷日 | 伊人狠狠色丁香婷婷综合 | 麻豆va一区二区三区久久浪 | 日韩av图片| 精品久久一级片 | 久久综合在线 | 亚洲 欧美 国产 va在线影院 | 最新99热| 国产精品第一页在线观看 | 97超碰色偷偷 | 啪啪小视频网站 | 波多野结衣视频一区二区三区 | 国产视频在线观看一区 | 五月激情姐姐 | 欧美一级大片在线观看 | 91精品国产成人www | 日韩精品免费一线在线观看 | 99操视频| 久久这里只有精品久久 | av免费电影在线观看 | 国产精品一区二区免费在线观看 | 日日夜精品 | 91黄色在线观看 | 成人app在线播放 | 亚洲精品456在线播放第一页 | 久久99精品久久只有精品 | 美女黄色网在线播放 | 色视频成人在线观看免 | 日韩一区二区在线免费观看 | 国产一区二区精品 | 中文字幕区 | 97超碰中文字幕 | 国产成人亚洲在线电影 | 国产尤物在线观看 | 国产精品一区二区av日韩在线 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 免费视频18 | 久久伊99综合婷婷久久伊 | 99国产精品久久久久久久久久 | 国产99久久久久 | 亚洲爽爽网 | 日韩精品在线视频免费观看 | 午夜视频在线网站 | 黄色免费在线看 | 亚洲精品资源 | 精品国产免费久久 | 91久久精| 国产天天综合 | 精品国产乱码一区二区三区在线 | 欧美一级久久久 | 免费观看9x视频网站在线观看 | 97在线影视 | 日韩av网址在线 | 999国内精品永久免费视频 | 天天色天天干天天色 | 免费看国产视频 | 在线观看中文av | 欧美日韩一区二区三区不卡 | 久久免费在线观看 | 日韩在线视频观看免费 | 国产无套一区二区三区久久 | 91在线中文字幕 | 视频在线一区 | 亚洲精品在线电影 | 国产精品一区二区av日韩在线 | 一区二区在线影院 | 嫩草伊人久久精品少妇av | 在线中文字幕网站 | 精品久操 | 中文字幕精品一区二区精品 | 91麻豆精品国产91 | 91麻豆高清视频 | 日韩国产精品一区 | 国产成人精品区 | 亚洲在线国产 | 网址你懂的在线观看 | 日韩欧美在线播放 | 国产 日韩 欧美 中文 在线播放 | 日本婷婷色 | 日日干网 | 夜夜操天天 | 免费色视频网址 | 97综合视频| 欧美在线观看视频免费 | 精油按摩av | 91热精品视频 | 国产精品免费久久久久影院仙踪林 | 亚洲精品国产精品国自产 | 久久人人爽人人爽人人片av免费 | 97精品超碰一区二区三区 | 国产成人a亚洲精品v | 一区二区三区在线电影 | 天天爽天天爽天天爽 | 中文字幕乱偷在线 | 亚洲日日夜夜 | 国产明星视频三级a三级点| 欧美在线视频一区二区 | 国产网站色 | 中文字幕免费 | 欧美国产不卡 | 在线看一区 | 日韩欧美综合视频 | 国产无区一区二区三麻豆 | 亚洲不卡av一区二区三区 | 99爱这里只有精品 | 久久久久久久久久毛片 | 99国产视频 | 免费成人在线观看 | 99国产精品视频免费观看一公开 | 国产精品毛片一区视频 | 久久中文网 | 又黄又刺激的网站 | 天天操天天射天天爱 | 久久这里只有精品视频首页 | 国产精品手机视频 | 丁香婷婷色综合亚洲电影 | 国产精品美乳一区二区免费 | 国产91在线 | 美洲 | 亚洲精品美女视频 | 国产一区二区久久精品 | 丝袜网站在线观看 | 日韩免费大片 | 97成人精品视频在线观看 | 精品国产_亚洲人成在线 | 亚洲一区精品人人爽人人躁 | 毛片网站在线观看 | 欧美日韩在线播放 | 国内精品久久久久久 | 国内精品福利视频 | 久草视频资源 | 黄色av大片 | 亚洲男男gaygay无套 | 国产乱码精品一区二区蜜臀 | 精品国产伦一区二区三区 | 国产精品亚洲a | 成人欧美一区二区三区在线观看 | 久久久久综合 | 人人舔人人射 | av一级片在线观看 | 日韩电影久久久 | 91禁看片| 欧美 日韩 性 | 亚洲精品一区二区三区高潮 | 顶级欧美色妇4khd | 91黄色在线观看 | 中文字幕在线视频免费播放 | 亚洲女欲精品久久久久久久18 | 精品国产乱码久久久久久1区二区 | 韩国精品福利一区二区三区 | 欧美一级免费片 | 免费看片亚洲 | 欧美国产日韩一区二区三区 | 深夜免费福利视频 | 免费的国产精品 | 国模视频一区二区三区 | 人人插人人插 | 婷婷精品进入 | 中文字幕乱码在线播放 | 国产网红在线观看 | 精品久久久成人 | 国产性xxxx | 成人国产精品免费观看 | 久久刺激视频 | 精品一二三四视频 | 国产精品久久久久久久久久久久冷 | 国产在线久草 | 夜夜躁日日躁狠狠躁 | 久久av网 | 成人激情开心网 | 在线观看国产高清视频 | 色婷婷综合久久久 | 欧美日韩性生活 | 日韩高清精品免费观看 | 国产小视频在线播放 | 操操操日日日干干干 | 中文字幕在线观看国产 | 精品电影一区 | 日韩字幕在线观看 | 日日操网 | 人人操日日干 | 免费在线播放 | 国产大陆亚洲精品国产 | 中文字幕免费一区二区 | 久久毛片视频 | 国模精品一区二区三区 | 精品久久久久免费极品大片 | 黄色三级免费 | 亚洲欧美日韩一二三区 | 国产在线高清视频 | 在线视频一二三 | 99热.com| 色婷婷av国产精品 | 国产69久久久欧美一级 | 久久久久久久久久久网站 | 96亚洲精品久久 | 中文字幕在线观看免费高清电影 | 欧美精品在线观看一区 | 久草视频首页 | 五月婷婷综合网 | 在线观看视频一区二区三区 | 久久免费试看 | av网站免费看 | 亚洲电影久久久 | 91系列在线观看 | 韩国一区二区三区视频 | 午夜三级理论 | 久久y | 亚洲精品国精品久久99热一 | 激情欧美一区二区免费视频 | 成人免费观看网站 | 久久久国产精品人人片99精片欧美一 | 日本久久视频 | 亚洲三级影院 | 一区二区三区三区在线 | 精品国产一二区 | h视频在线看 | av线上看| 国产高清在线观看 | 99精品欧美一区二区 | 亚洲狠狠| 亚洲国产日韩欧美 | 国产99亚洲 | 久久激情五月丁香伊人 | 777久久久| 国产精品系列在线观看 | a电影在线观看 | 在线岛国av | 午夜精品视频一区二区三区在线看 | 国产精品久久片 | 一级欧美一级日韩 | 一本一本久久a久久精品综合 | 一本一道久久a久久综合蜜桃 | 婷婷在线播放 | 久久精品日韩 | 国产成人精品免高潮在线观看 | 日韩午夜精品福利 | 国产一区高清在线 | 日韩中文字幕视频在线 | 天天爱天天操 | 美女黄久久 | 人人要人人澡人人爽人人dvd | 精品国产1区二区 | 91av手机在线| 996久久国产精品线观看 | 深爱激情五月网 | 99热在线精品观看 | 亚洲另类人人澡 | 精品国产欧美一区二区三区不卡 | 久久精品欧美一 | 中文字幕国产在线 | 亚洲精品一区二区网址 | 久久天天躁狠狠躁夜夜不卡公司 | 婷婷久久丁香 | 四虎成人精品永久免费av | 国产精品一区二区免费 | 丁香婷婷社区 | 99久久综合狠狠综合久久 | 日本在线观看一区 | 91av原创| 久久综合久久综合久久 | 丁香九月婷婷综合 | 国产一级精品绿帽视频 | 男女激情免费网站 | 天堂av在线 | 久草亚洲视频 | 亚洲欧美视频一区二区三区 | 三上悠亚在线免费 | 精品视频在线观看 | 免费在线观看国产黄 | 99久久久久久久久 | 日本中文字幕电影在线免费观看 | a级国产毛片 | 天天操夜夜操天天射 | 青春草免费视频 | 99人久久精品视频最新地址 | 日韩字幕在线 | 国产不卡在线 | 国产黄色片久久久 | 五月天激情综合 | 国产精品va视频 | 免费人人干| 色综合天天天天做夜夜夜夜做 | 亚洲综合五月天 | 精品久久久久久久久亚洲 | 国产麻豆传媒 | av在线播放网址 | 欧美在线视频二区 | 色久综合| 国产亚洲精品中文字幕 | 欧美日韩高清不卡 | 欧美 日韩 国产 成人 在线 | 日韩av手机在线观看 | 91麻豆精品国产自产在线游戏 | 天天操天天操天天操天天操天天操天天操 | 午夜电影 电影 | 毛片视频电影 | 九七人人干 | 911久久 | 干狠狠| 亚洲国产精彩中文乱码av | 97超碰人人模人人人爽人人爱 | 成人播放器 | 午夜免费视频网站 | 国产精品手机播放 | 91人人人 | 日韩在线短视频 | 国产手机精品视频 | 成人在线观看影院 | 91国内在线 | 亚a在线 | 国内精品久久久 | 国产亚洲无 | 中文在线天堂资源 | 99这里只有久久精品视频 | 天天色天天操天天爽 | 黄色av电影一级片 | 成年人视频免费在线播放 | 欧美a级在线免费观看 | 五月天婷婷丁香花 | 探花视频免费观看 | 在线观看免费国产小视频 | 中文字幕免费观看全部电影 | 天天干天天射天天插 | 日韩免费二区 | 四虎成人精品永久免费av | 欧美一级淫片videoshd | 丰满少妇在线观看 | 精品国产一区二区三区在线观看 | 久久久久久久久免费 | 国产一区久久 | 久久久久久毛片精品免费不卡 | 一区二区三区高清在线 | 免费黄色a级毛片 | 成人黄大片视频在线观看 | 福利视频精品 | 不卡的av电影在线观看 | 在线国产中文字幕 | 91福利视频免费 | 国产精品久久久久久久7电影 | 国产黄色片免费 | 中文字幕电影一区 | 日韩色高清 | 91麻豆精品国产91久久久使用方法 | 麻豆免费看片 | 国产高清99 | 在线看一区 | 91在线播放视频 | 亚洲精品玖玖玖av在线看 | av电影不卡在线 | 亚洲精选视频免费看 | 成人宗合网 | 福利视频第一页 | 亚洲成人午夜在线 | 成人黄色视 | 婷婷在线资源 | 一区二区国产精品 | 最新高清无码专区 | 亚洲伊人网在线观看 | 成年人在线观看网站 | 日韩女同一区二区三区在线观看 | 久草精品在线播放 | 人人操日日干 | 国产精品白浆视频 | 久久久国产精品一区二区三区 | 天天se天天cao天天干 | 九九九九热精品免费视频点播观看 | 六月婷操 | 丝袜美女在线 | 亚洲精品一区二区18漫画 | 手机在线看永久av片免费 | 免费一级片视频 | 五月天中文字幕 | 免费在线一区二区 | 69国产盗摄一区二区三区五区 | 成人亚洲精品国产www | 狠狠的操| 色噜噜狠狠狠狠色综合 | 国产精品九九九九九 | 在线成人高清电影 | 激情视频一区二区 | 久久刺激视频 | 五月天国产| 片网址| 欧美激情视频在线观看免费 | 午夜av一区二区三区 | 日韩欧在线 | 亚洲我射av | 99 久久久久 | 国产99久久久精品 | 中文字幕免费播放 | 99爱视频在线观看 | 99久久精| 色综合久久久久 | 天天躁天天操 | 激情视频一区二区三区 | 免费黄色网址大全 | 视频成人免费 | 亚洲国产免费看 | 99热这里只有精品免费 | 日韩欧美国产成人 | 国产aaa毛片 | 亚洲综合五月天 | 97视频总站 | 中文字幕高清av | 亚洲精品伦理在线 | 国产成人三级在线 | 亚洲 欧美 综合 在线 精品 | av免费网站在线观看 | 精品久操| 欧美另类交在线观看 | 成人毛片久久 | 狠狠搞,com| 国产一二三在线视频 | 天天天天干 | 午夜在线国产 | www五月| 波多野结依在线观看 | 一区中文字幕在线观看 | 91麻豆精品国产91久久久使用方法 | av在线播放不卡 | 人人射人人 | 美女很黄免费网站 | 在线观看你懂的网址 | 91高清视频 | 涩涩爱夜夜爱 | 青草视频在线 | 成人一级片在线观看 | 奇人奇案qvod | 成年人视频在线观看免费 | 夜夜操网站 | 久久久久综合 | 欧美在线资源 | 99热九九这里只有精品10 | 91黄色小网站 | 中文字幕乱码电影 | 久久精品理论 | 99热在线国产| 久久久久高清 | 九九精品无码 | 久久全国免费视频 | 18国产精品福利片久久婷 | 色婷婷影视 | 日韩一片| 久久久久久国产一区二区三区 | 国产视频资源 | 99c视频高清免费观看 | 国产福利网站 | 免费污片| 国产精品一区免费观看 | 欧美乱淫视频 | av在线看网站| 美女黄频在线观看 | 久精品视频在线 | 午夜视频福利 | av资源在线看 | 一区二区三区在线播放 | 91精品国产欧美一区二区 | 超碰97人 | www.亚洲黄 | 色综合激情久久 | 国产精品免费观看网站 | 四月婷婷在线观看 | 欧美日韩aa | 99精品黄色片免费大全 | 久久人人爽人人爽人人 | 色播五月激情综合网 | 久久男人影院 | 国产美女视频免费 | 日韩精品一区在线播放 | 五月婷婷狠狠 | 久久久久高清毛片一级 | 日韩精品一区二区三区在线播放 | www.综合网.com | 91看片成人 | 亚洲欧美激情精品一区二区 | 激情综合五月 | 日日夜夜精品视频天天综合网 | 又黄又爽又湿又无遮挡的在线视频 | 99热精品国产一区二区在线观看 | 亚洲精品成人在线 | 欧美-第1页-屁屁影院 | 麻豆免费看片 | 天堂麻豆 | 香蕉视频免费看 | 免费网站看v片在线a | 欧洲精品码一区二区三区免费看 | 日韩字幕| 99热最新地址 | 91伊人影院 | 在线观看视频免费播放 | 亚洲午夜久久久久 | 国产精品国产亚洲精品看不卡15 | www.久久色 | 最新中文字幕在线观看视频 | 国产精品9999 | 成人网在线免费视频 | 国产精品中文 | 三级黄色在线 | 国产精品乱码高清在线看 | 日韩理论在线观看 | 久久尤物电影视频在线观看 | 五月婷丁香网 | 亚洲精品99| 人人爱人人做人人爽 | 成人av教育 | 免费看黄色毛片 | 色天天久久 | 日日干天天操 | 又污又黄网站 | 4438全国亚洲精品在线观看视频 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 亚洲精品国产综合久久 | 亚洲精品h | a黄色片在线观看 | 狠狠狠色狠狠色综合 | 免费看成人a | 久久免费视频在线观看6 | 欧美国产高清 | 欧美日韩国产一区 | 日日狠狠 | 免费av网站观看 | 片网址 | 欧美人人爱 | av电影免费在线播放 | a极黄色片 | 中文字幕在线日亚洲9 | 久久久久国产精品免费网站 | 亚洲视频2 | 香蕉视频国产在线 | 精品女同一区二区三区在线观看 | 最新国产中文字幕 | 96香蕉视频| 97av免费视频 | avove黑丝| 中文字幕在线免费看 | 91精品一区国产高清在线gif | 91看片淫黄大片在线播放 | 国产一级视频在线观看 | 国产视频亚洲精品 | 欧美一区二区三区激情视频 | 亚洲成av人片 | 黄污视频网站 | 免费激情在线电影 | 特片网久久 | 色五月成人 | 免费三级网 | 99久久这里有精品 | 精品久久91 | 毛片视频电影 | 五月天堂网 | 国产精品成人免费 | av网站在线免费观看 | 亚洲午夜久久久久久久久久久 | 婷婷丁香狠狠爱 | 欧美激情精品久久久久久免费 | 亚洲aⅴ一区二区三区 | 91精品久久香蕉国产线看观看 | 国产xxxx做受性欧美88 | 久久毛片网 | 免费电影一区二区三区 | 久久综合九色综合网站 | 亚洲人成精品久久久久 | 久久久久久久99 | 国产精品久久久久久久99 | 91av视屏 | 欧美性生活一级片 | 久久精品免费播放 | 国产精品久久久久久久久搜平片 | 久久经典国产视频 | 麻豆久久一区二区 | 国产大尺度视频 | 国模吧一区 | 一级电影免费在线观看 | 国产九色视频在线观看 | 久久亚洲在线 | 伊人春色电影网 | 久久精品一二三区 | 九九国产视频 | 天堂网一区二区 | 手机在线看片日韩 | 免费网站色 | 国产精品久久久久影视 | 久久精品五月 | 天天色图| 91精品少妇偷拍99 | 中文字幕 成人 | 在线免费观看羞羞视频 | 久久久精品二区 | 探花视频在线版播放免费观看 | 亚洲欧洲精品一区二区 | 91精品视频一区 | 九月婷婷色 | 碰天天操天天 | 一二三精品视频 | 91视频久久久 | 日韩免费在线播放 | 国产淫a | 色视频网站在线 | 天天操夜夜操夜夜操 | 成人影视免费看 | 日韩av免费观看网站 | 国产成人精品一区二区三区在线 | av超碰免费在线 | 免费在线观看黄网站 | 国产精品久久久久久久久大全 | 九九视频在线 | 欧美日韩一区二区免费在线观看 | 婷婷色在线观看 | 婷婷在线网 | 成人在线免费看视频 | 懂色av一区二区三区蜜臀 | 韩日av一区二区 | 国产美女搞久久 | 91精品国产综合久久福利 | 久久精品香蕉 | 一区二区三区在线免费观看 | 色在线免费 | av中文字幕网址 | 亚洲精品国精品久久99热 | 日韩中文字幕第一页 | 在线亚洲观看 | 久久综合久色欧美综合狠狠 | 蜜桃视频在线观看一区 | 色www精品视频在线观看 | 特级黄色一级 | 日韩视频免费在线 | 在线有码中文 | 日韩中文字幕视频在线 | 91探花系列在线播放 | 亚洲另类在线视频 | 国内精品久久久 | 亚洲电影一级黄 | 久久久九色精品国产一区二区三区 | 久久久伊人网 | 成人av电影免费观看 | 久久久久久久久久久免费视频 | 国产69久久精品成人看 | 精品爱爱 | 欧美日本三级 | 欧美巨大荫蒂茸毛毛人妖 | 免费a级观看 | 一区二区三区免费看 | 日本公妇在线观看 | 精品国产亚洲一区二区麻豆 | 亚洲国产人午在线一二区 | 91视频成人免费 | 国产精品a久久久久 | 黄色av影视| 国产人成免费视频 | 手机看片国产 | 日韩深夜在线观看 | 欧美久久久 | 国产精品欧美久久久久天天影视 | 在线观看中文字幕第一页 | 人人添人人澡人人澡人人人爽 | 久久成人国产精品一区二区 | 伊人狠狠色 | 91麻豆精品一区二区三区 | www色片| 国产亚洲精品久久久久久无几年桃 | 欧美在线观看禁18 | 日本精品一二区 | 国产三级午夜理伦三级 | av在线免费观看不卡 | 成人黄色中文字幕 | 天天操天天射天天添 | 欧美精品久久久久久久久久 | 天天操夜夜逼 | 麻豆视频免费在线观看 | 91成人精品一区在线播放69 | 久色小说 | 免费在线国产精品 | 精品字幕在线 | 国产亚洲激情视频在线 | 日本69hd| 国产一区二区三区黄 | 日本少妇视频 | 天天射天天操天天色 | 黄色一级片视频 | 久久久久国产精品免费免费搜索 | 国内精品久久久久影院男同志 | 人人草在线视频 | 久久人人添人人爽添人人88v | 中文 一区二区 | 国产一区二区精 | 成人91在线观看 | 天天草av | 免费在线观看午夜视频 | 免费在线观看av网站 | 欧美性极品xxxx娇小 | 国产日韩中文字幕在线 | 日韩一二三在线 | www.天天射| 亚洲精品小视频 | 国产小视频免费在线网址 | 超碰在线cao | 在线观看黄色小视频 | 国产精品24小时在线观看 | 国产手机在线观看 | 国产不卡一二三区 | 在线视频中文字幕一区 | 五月天婷亚洲天综合网精品偷 | 天天摸天天舔 | 欧美在线视频二区 | 亚洲日本激情 | 国产视频二| 91传媒视频在线观看 | 日韩欧美69| 成人a在线观看高清电影 | 免费观看黄| 91成人蝌蚪| 美州a亚洲一视本频v色道 | 一区 在线 影院 | 久久久久久久久久久综合 | 黄色三级在线 | 三级黄色网址 | 在线观看免费版高清版 | 手机看国产毛片 | 国产免费作爱视频 | 欧美日韩国产亚洲乱码字幕 | 91精品视频在线免费观看 | 在线精品观看国产 | 国产精品久久久久久久久婷婷 | 国产精品久久久久永久免费 | 去干成人网 | 中文字幕在线观看一区二区 | 亚洲免费高清视频 | 99精品欧美一区二区三区黑人哦 | 国产精品一区二区久久精品爱微奶 | 日韩在线视频线视频免费网站 | 中文在线字幕免 | 91资源在线播放 | 丁香花中文在线免费观看 | 国产不卡在线观看 | 国产精品亚洲a | 亚洲乱码久久 | 奇米影视在线99精品 | 国产视频在线观看一区 | 超碰久热 | 国精产品永久999 | 特级黄色片免费看 | 91成人免费看片 | 综合网天天射 | 色综合久久88色综合天天人守婷 | 黄色网www | 狠狠色丁香婷婷综合视频 | 色综合天天做天天爱 | 夜夜骑日日操 | 91视频91色 | 国产精品久久婷婷六月丁香 | 久久在视频 | 国产一级黄大片 | 国产精品入口a级 | 久久精品—区二区三区 | 久久伦理 | 国产精品高潮久久av | 黄色中文字幕 | 五月婷婷影院 | 99精品视频免费在线观看 | 麻豆一区二区 | 亚洲va欧洲va国产va不卡 | 国产在线视频不卡 | 超黄视频网站 |